Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit eb74fc7

Browse files
Merge branch 'master' of github.com:youngyangyang04/leetcode-master
2 parents 4b01a7d + 98841a3 commit eb74fc7

File tree

1,151 files changed

+903
-903
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,151 files changed

+903
-903
lines changed

problems/0001.两数之和.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,10 @@ map目的用来存放我们访问过的元素,因为遍历数组的时候,
8585

8686
过程如下:
8787

88-
![过程一](https://code-thinking-1253855093.file.myqcloud.com/pics/20220711202638.png)
88+
![过程一](images/0001.两数之和-01.png)
8989

9090

91-
![过程二](https://code-thinking-1253855093.file.myqcloud.com/pics/20230220223536.png)
91+
![过程二](images/0001.两数之和-02.png)
9292

9393
C++代码:
9494

problems/0005.最长回文子串.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹
108108

109109
dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图:
110110

111-
![647.回文子串](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171032473.jpg)
111+
![647.回文子串](images/0005.最长回文子串-01.jpg)
112112

113113
如果这矩阵是从上到下,从左到右遍历,那么会用到没有计算过的dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断了[i,j]是不是回文,那结果一定是不对的。
114114

@@ -142,7 +142,7 @@ for (int i = s.size() - 1; i >= 0; i--) { // 注意遍历顺序
142142

143143
举例,输入:"aaa",dp[i][j]状态如下:
144144

145-
![647.回文子串1](https://code-thinking-1253855093.file.myqcloud.com/pics/20210121171059951.jpg)
145+
![647.回文子串1](images/0005.最长回文子串-02.jpg)
146146

147147
**注意因为dp[i][j]的定义,所以j一定是大于等于i的,那么在填充dp[i][j]的时候一定是只填充右上半部分**
148148

problems/0015.三数之和.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public:
102102

103103
动画效果如下:
104104

105-
![15.三数之和](https://code-thinking.cdn.bcebos.com/gifs/15.%E4%B8%89%E6%95%B0%E4%B9%8B%E5%92%8C.gif)
105+
![15.三数之和](images/0015.三数之和-01.gif)
106106

107107
拿这个nums数组来举例,首先将数组排序,然后有一层for循环,i从下标0的地方开始,同时定一个下标left 定义在i+1的位置上,定义下标right 在数组结尾的位置上。
108108

problems/0017.电话号码的字母组合.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
1515

16-
![17.电话号码的字母组合](https://code-thinking-1253855093.file.myqcloud.com/pics/2020102916424043.png)
16+
![17.电话号码的字母组合](images/0017.电话号码的字母组合-01.png)
1717

1818
示例:
1919
* 输入:"23"
@@ -66,7 +66,7 @@ const string letterMap[10] = {
6666

6767
例如:输入:"23",抽象为树形结构,如图所示:
6868

69-
![17. 电话号码的字母组合](https://code-thinking-1253855093.file.myqcloud.com/pics/20201123200304469.png)
69+
![17. 电话号码的字母组合](images/0017.电话号码的字母组合-02.png)
7070

7171
图中可以看出遍历的深度,就是输入"23"的长度,而叶子节点就是我们要收集的结果,输出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
7272

problems/0019.删除链表的倒数第N个节点.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
示例 1:
1919

2020

21-
![19.删除链表的倒数第N个节点](https://code-thinking-1253855093.file.myqcloud.com/pics/20210510085957392.png)
21+
![19.删除链表的倒数第N个节点](images/0019.删除链表的倒数第N个节点-01.png)
2222

2323
输入:head = [1,2,3,4,5], n = 2
2424
输出:[1,2,3,5]
@@ -51,16 +51,16 @@
5151

5252
* 定义fast指针和slow指针,初始值为虚拟头结点,如图:
5353

54-
<img src='https://code-thinking.cdn.bcebos.com/pics/19.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.png' width=600> </img></div>
54+
<img src='images/0019.删除链表的倒数第N个节点-02.png' width=600> </img></div>
5555

5656
* fast首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作),如图:
57-
<img src='https://code-thinking.cdn.bcebos.com/pics/19.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B91.png' width=600> </img></div>
57+
<img src='images/0019.删除链表的倒数第N个节点-03.png' width=600> </img></div>
5858

5959
* fast和slow同时移动,直到fast指向末尾,如题:
60-
<img src='https://code-thinking.cdn.bcebos.com/pics/19.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B92.png' width=600> </img></div>
60+
<img src='images/0019.删除链表的倒数第N个节点-04.png' width=600> </img></div>
6161
//图片中有错别词:应该将“只到”改为“直到”
6262
* 删除slow指向的下一个节点,如图:
63-
<img src='https://code-thinking.cdn.bcebos.com/pics/19.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B93.png' width=600> </img></div>
63+
<img src='images/0019.删除链表的倒数第N个节点-05.png' width=600> </img></div>
6464

6565
此时不难写出如下C++代码:
6666

problems/0020.有效的括号.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,21 +83,21 @@ cd a/b/c/../../
8383

8484

8585
1. 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
86-
![括号匹配1](https://code-thinking-1253855093.file.myqcloud.com/pics/2020080915505387.png)
86+
![括号匹配1](images/0020.有效的括号-01.png)
8787

8888
2. 第二种情况,括号没有多余,但是 括号的类型没有匹配上。
89-
![括号匹配2](https://code-thinking-1253855093.file.myqcloud.com/pics/20200809155107397.png)
89+
![括号匹配2](images/0020.有效的括号-02.png)
9090

9191
3. 第三种情况,字符串里右方向的括号多余了,所以不匹配。
92-
![括号匹配3](https://code-thinking-1253855093.file.myqcloud.com/pics/20200809155115779.png)
92+
![括号匹配3](images/0020.有效的括号-03.png)
9393

9494

9595

9696
我们的代码只要覆盖了这三种不匹配的情况,就不会出问题,可以看出 动手之前分析好题目的重要性。
9797

9898
动画如下:
9999

100-
![20.有效括号](https://code-thinking.cdn.bcebos.com/gifs/20.有效括号.gif)
100+
![20.有效括号](images/0020.有效的括号-04.gif)
101101

102102

103103
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false

problems/0024.两两交换链表中的节点.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
1515

1616

17-
<img src='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-%E9%A2%98%E6%84%8F.jpg' width=600 alt='24.两两交换链表中的节点-题意'> </img></div>
17+
<img src='images/0024.两两交换链表中的节点-01.jpg' width=600 alt='24.两两交换链表中的节点-题意'> </img></div>
1818

1919
## 算法公开课
2020

@@ -33,16 +33,16 @@
3333

3434
初始时,cur指向虚拟头结点,然后进行如下三步:
3535

36-
![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)
36+
![24.两两交换链表中的节点1](images/0024.两两交换链表中的节点-02.png)
3737

3838
操作之后,链表如下:
3939

40-
![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)
40+
![24.两两交换链表中的节点2](images/0024.两两交换链表中的节点-03.png)
4141

4242
看这个可能就更直观一些了:
4343

4444

45-
![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)
45+
![24.两两交换链表中的节点3](images/0024.两两交换链表中的节点-04.png)
4646

4747
对应的C++代码实现如下: (注释中详细和如上图中的三步做对应)
4848

@@ -83,7 +83,7 @@ public:
8383

8484
心想应该没有更好的方法了吧,也就 $O(n)$ 的时间复杂度,重复提交几次,这样了:
8585

86-
![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)
86+
![24.两两交换链表中的节点](images/0024.两两交换链表中的节点-05.png)
8787

8888
力扣上的统计如果两份代码是 100ms 和 300ms的耗时,其实是需要注意的。
8989

problems/0027.移除元素.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545

4646
删除过程如下:
4747

48-
![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)
48+
![27.移除元素-暴力解法](images/0027.移除元素-01.gif)
4949

5050
很明显暴力解法的时间复杂度是O(n^2),这道题目暴力解法在leetcode上是可以过的。
5151

@@ -89,7 +89,7 @@ public:
8989

9090
删除过程如下:
9191

92-
![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)
92+
![27.移除元素-双指针法](images/0027.移除元素-02.gif)
9393

9494
很多同学不了解
9595

problems/0028.实现strStr.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ next数组就是一个前缀表(prefix table)。
108108

109109
如动画所示:
110110

111-
![KMP详解1](https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B21.gif)
111+
![KMP详解1](images/0028.实现strStr-01.gif)
112112

113113
动画里,我特意把 子串`aa` 标记上了,这是有原因的,大家先注意一下,后面还会说到。
114114

@@ -149,11 +149,11 @@ next数组就是一个前缀表(prefix table)。
149149
这就是前缀表,那为啥就能告诉我们 上次匹配的位置,并跳过去呢?
150150

151151
回顾一下,刚刚匹配的过程在下标5的地方遇到不匹配,模式串是指向f,如图:
152-
<img src='https://code-thinking.cdn.bcebos.com/pics/KMP%E7%B2%BE%E8%AE%B21.png' width=600 alt='KMP精讲1'> </img></div>
152+
<img src='images/0028.实现strStr-02.png' width=600 alt='KMP精讲1'> </img></div>
153153

154154

155155
然后就找到了下标2,指向b,继续匹配:如图:
156-
<img src='https://code-thinking.cdn.bcebos.com/pics/KMP%E7%B2%BE%E8%AE%B22.png' width=600 alt='KMP精讲2'> </img></div>
156+
<img src='images/0028.实现strStr-03.png' width=600 alt='KMP精讲2'> </img></div>
157157

158158
以下这句话,对于理解为什么使用前缀表可以告诉我们匹配失败之后跳到哪里重新匹配 非常重要!
159159

@@ -169,15 +169,15 @@ next数组就是一个前缀表(prefix table)。
169169

170170
如图:
171171

172-
<img src='https://code-thinking.cdn.bcebos.com/pics/KMP%E7%B2%BE%E8%AE%B25.png' width=600 alt='KMP精讲5'> </img></div>
172+
<img src='images/0028.实现strStr-04.png' width=600 alt='KMP精讲5'> </img></div>
173173

174174
长度为前1个字符的子串`a`,最长相同前后缀的长度为0。(注意字符串的**前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串****后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串**。)
175175

176-
<img src='https://code-thinking.cdn.bcebos.com/pics/KMP%E7%B2%BE%E8%AE%B26.png' width=600 alt='KMP精讲6'> </img></div>
176+
<img src='images/0028.实现strStr-05.png' width=600 alt='KMP精讲6'> </img></div>
177177

178178
长度为前2个字符的子串`aa`,最长相同前后缀的长度为1。
179179

180-
<img src='https://code-thinking.cdn.bcebos.com/pics/KMP%E7%B2%BE%E8%AE%B27.png' width=600 alt='KMP精讲7'> </img></div>
180+
<img src='images/0028.实现strStr-06.png' width=600 alt='KMP精讲7'> </img></div>
181181

182182
长度为前3个字符的子串`aab`,最长相同前后缀的长度为0。
183183

@@ -187,13 +187,13 @@ next数组就是一个前缀表(prefix table)。
187187
长度为前6个字符的子串`aabaaf`,最长相同前后缀的长度为0。
188188

189189
那么把求得的最长相同前后缀的长度就是对应前缀表的元素,如图:
190-
<img src='https://code-thinking.cdn.bcebos.com/pics/KMP%E7%B2%BE%E8%AE%B28.png' width=600 alt='KMP精讲8'> </img></div>
190+
<img src='images/0028.实现strStr-07.png' width=600 alt='KMP精讲8'> </img></div>
191191

192192
可以看出模式串与前缀表对应位置的数字表示的就是:**下标i之前(包括i)的字符串中,有多大长度的相同前缀后缀。**
193193

194194
再来看一下如何利用 前缀表找到 当字符不匹配的时候应该指针应该移动的位置。如动画所示:
195195

196-
![KMP精讲2](https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B22.gif)
196+
![KMP精讲2](images/0028.实现strStr-08.gif)
197197

198198
找到的不匹配的位置, 那么此时我们要看它的前一个字符的前缀表的数值是多少。
199199

@@ -227,7 +227,7 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减
227227

228228
匹配过程动画如下:
229229

230-
![KMP精讲4](https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B24.gif)
230+
![KMP精讲4](images/0028.实现strStr-09.gif)
231231

232232
### 时间复杂度分析
233233

@@ -334,7 +334,7 @@ void getNext(int* next, const string& s){
334334

335335
代码构造next数组的逻辑流程动画如下:
336336

337-
![KMP精讲3](https://code-thinking.cdn.bcebos.com/gifs/KMP%E7%B2%BE%E8%AE%B23.gif)
337+
![KMP精讲3](images/0028.实现strStr-10.gif)
338338

339339
得到了next数组之后,就要用这个来做匹配了。
340340

problems/0031.下一个排列.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969

7070
以求1243为例,流程如图:
7171

72-
<img src='https://code-thinking.cdn.bcebos.com/pics/31.下一个排列.png' width=600> </img></div>
72+
<img src='images/0031.下一个排列-01.png' width=600> </img></div>
7373

7474
对应的C++代码如下:
7575

problems/0035.搜索插入位置.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343

4444
这道题目,要在数组中插入目标值,无非是这四种情况。
4545

46-
![35_搜索插入位置3](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216232148471.png)
46+
![35_搜索插入位置3](images/0035.搜索插入位置-01.png)
4747

4848
* 目标值在数组所有元素之前
4949
* 目标值等于数组中某一个元素
@@ -84,14 +84,14 @@ public:
8484
8585
效率如下:
8686
87-
![35_搜索插入位置](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216232127268.png)
87+
![35_搜索插入位置](images/0035.搜索插入位置-02.png)
8888
8989
### 二分法
9090
9191
既然暴力解法的时间复杂度是O(n),就要尝试一下使用二分查找法。
9292
9393
94-
![35_搜索插入位置4](https://code-thinking-1253855093.file.myqcloud.com/pics/202012162326354.png)
94+
![35_搜索插入位置4](images/0035.搜索插入位置-03.png)
9595
9696
大家注意这道题目的前提是数组是有序数组,这也是使用二分查找的基础条件。
9797
@@ -101,7 +101,7 @@ public:
101101
102102
大体讲解一下二分法的思路,这里来举一个例子,例如在这个数组中,使用二分法寻找元素为5的位置,并返回其下标。
103103
104-
![35_搜索插入位置5](https://code-thinking-1253855093.file.myqcloud.com/pics/20201216232659199.png)
104+
![35_搜索插入位置5](images/0035.搜索插入位置-04.png)
105105
106106
二分查找涉及的很多的边界条件,逻辑比较简单,就是写不好。
107107
@@ -152,7 +152,7 @@ public:
152152
* 空间复杂度:O(1)
153153

154154
效率如下:
155-
![35_搜索插入位置2](https://code-thinking-1253855093.file.myqcloud.com/pics/2020121623272877.png)
155+
![35_搜索插入位置2](images/0035.搜索插入位置-05.png)
156156

157157
### 二分法第二种写法
158158

problems/0037.解数独.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
2121
空白格用 '.' 表示。
2222

23-
![解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/202011171912586.png)
23+
![解数独](images/0037.解数独-01.png)
2424

2525
一个数独。
2626

27-
![解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/20201117191340669.png)
27+
![解数独](images/0037.解数独-02.png)
2828

2929
答案被标成红色。
3030

@@ -54,7 +54,7 @@
5454

5555
因为这个树形结构太大了,我抽取一部分,如图所示:
5656

57-
![37.解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111720451790-20230310131816104.png)
57+
![37.解数独](images/0037.解数独-03.png)
5858

5959

6060
### 回溯三部曲
@@ -85,7 +85,7 @@ bool backtracking(vector<vector<char>>& board)
8585
8686
* 递归单层搜索逻辑
8787
88-
![37.解数独](https://code-thinking-1253855093.file.myqcloud.com/pics/2020111720451790-20230310131822254.png)
88+
![37.解数独](images/0037.解数独-04.png)
8989
9090
在树形图中可以看出我们需要的是一个二维的递归 (一行一列)
9191

problems/0039.组合总和.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ candidates 中的数字可以无限制重复被选取。
5252

5353
本题搜索的过程抽象成树形结构如下:
5454

55-
![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367.png)
55+
![39.组合总和](images/0039.组合总和-01.png)
5656
注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!
5757

5858
而在[77.组合](https://programmercarl.com/0077.组合.html)[216.组合总和III](https://programmercarl.com/0216.组合总和III.html) 中都可以知道要递归K层,因为要取k个元素的组合。
@@ -87,7 +87,7 @@ void backtracking(vector<int>& candidates, int target, int sum, int startIndex)
8787
8888
在如下树形结构中:
8989
90-
![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367-20230310135337214.png)
90+
![39.组合总和](images/0039.组合总和-02.png)
9191
9292
从叶子节点可以清晰看到,终止只有两种情况,sum大于target和sum等于target。
9393
@@ -160,7 +160,7 @@ public:
160160
161161
在这个树形结构中:
162162
163-
![39.组合总和](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170730367-20230310135342472.png)
163+
![39.组合总和](images/0039.组合总和-03.png)
164164
165165
以及上面的版本一的代码大家可以看到,对于sum已经大于target的情况,其实是依然进入了下一层递归,只是下一层递归结束判断的时候,会判断sum > target的话就返回。
166166
@@ -173,7 +173,7 @@ public:
173173
如图:
174174
175175
176-
![39.组合总和1](https://code-thinking-1253855093.file.myqcloud.com/pics/20201223170809182.png)
176+
![39.组合总和1](images/0039.组合总和-04.png)
177177
178178
for循环剪枝代码如下:
179179

problems/0040.组合总和II.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ candidates 中的每个数字在每个组合中只能使用一次。
8080

8181
选择过程树形结构如图所示:
8282

83-
![40.组合总和II](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000918.png)
83+
![40.组合总和II](images/0040.组合总和II-01.png)
8484

8585
可以看到图中,每个节点相对于 [39.组合总和](https://mp.weixin.qq.com/s/FLg8G6EjVcxBjwCbzpACPw)我多加了used数组,这个used数组下面会重点介绍。
8686

@@ -130,7 +130,7 @@ if (sum == target) {
130130

131131
这块比较抽象,如图:
132132

133-
![40.组合总和II1](https://code-thinking-1253855093.file.myqcloud.com/pics/20230310000954.png)
133+
![40.组合总和II1](images/0040.组合总和II-02.png)
134134

135135
我在图中将used的变化用橘黄色标注上,可以看出在candidates[i] == candidates[i - 1]相同的情况下:
136136

@@ -141,7 +141,7 @@ if (sum == target) {
141141

142142
而 used[i - 1] == true,说明是进入下一层递归,去下一个数,所以是树枝上,如图所示:
143143

144-
![](https://code-thinking-1253855093.file.myqcloud.com/pics/20221021163812.png)
144+
![](images/0040.组合总和II-03.png)
145145

146146

147147
**这块去重的逻辑很抽象,网上搜的题解基本没有能讲清楚的,如果大家之前思考过这个问题或者刷过这道题目,看到这里一定会感觉通透了很多!**

0 commit comments

Comments
 (0)