Skip to content

Commit bc41a00

Browse files
authored
Merge branch 'youngyangyang04:master' into master
2 parents 5efb107 + c9fc0cb commit bc41a00

13 files changed

+283
-28
lines changed

README.md

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
👉 推荐 [Gitee同步](https://gitee.com/programmercarl/leetcode-master)
55

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

565565
# 关于作者
566566

567-
大家好,我是程序员Carl,哈工大师兄,ACM 校赛、黑龙江省赛、东北四省赛金牌、亚洲区域赛铜牌获得者,先后在腾讯和百度从事后端技术研发,CSDN博客专家。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。
567+
大家好,我是程序员Carl,哈工大师兄,《代码随想录》作者,先后在腾讯和百度从事后端技术研发,CSDN博客专家。对算法和C++后端技术有一定的见解,利用工作之余重新刷leetcode。
568568

569-
加入刷题微信群,备注:「个人简单介绍」 + 组队刷题
569+
加入「代码随想录」刷题小分队(微信群),可以扫下方二维码加我微信。
570570

571-
也欢迎与我交流,备注:「个人简单介绍」 + 交流,围观朋友圈,做点赞之交(备注没有自我介绍不通过哦)
571+
如果是已工作,备注:姓名-城市-岗位-组队刷题。如果学生,备注:姓名-学校-年级-组队刷题。**备注没有自我介绍不通过哦**
572+
573+
<div align="center"><img src="https://code-thinking-1253855093.file.myqcloud.com/pics/20220102204804.png" data-img="1" width="200" height="200"></img></div>
572574

573-
<a name="微信"></a>
574-
<div align="center"><img src="https://code-thinking-1253855093.file.myqcloud.com/pics/20211230153955.png" data-img="1" width="200" height="200"></img></div>
575575

576576

577577
# 公众号
@@ -585,10 +585,3 @@
585585
<a name="公众号"></a>
586586
<div align="center"><img src="https://code-thinking-1253855093.file.myqcloud.com/pics/20211026122841.png" data-img="1" width="650" height="500"></img></div>
587587

588-
# 服务器
589-
590-
<p align="center"><strong>阿里云服务器,双11特价活动🔥🔥🔥🔥</p>
591-
<p align="center">
592-
<a href="https://www.aliyun.com/minisite/goods?taskPkg=1111ydsrwb&pkgSid=1959&recordId=962642&userCode=roof0wob" target="_blank">
593-
<img src="./pics/阿里云.png" width="1000"/>
594-
</a>

problems/0027.移除元素.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,23 @@ var removeElement = (nums, val) => {
197197
};
198198
```
199199

200+
TypeScript:
201+
202+
```typescript
203+
function removeElement(nums: number[], val: number): number {
204+
let slowIndex: number = 0, fastIndex: number = 0;
205+
while (fastIndex < nums.length) {
206+
if (nums[fastIndex] !== val) {
207+
nums[slowIndex++] = nums[fastIndex];
208+
}
209+
fastIndex++;
210+
}
211+
return slowIndex;
212+
};
213+
```
214+
200215
Ruby:
216+
201217
```ruby
202218
def remove_element(nums, val)
203219
i = 0

problems/0028.实现strStr.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -649,6 +649,41 @@ class Solution {
649649
}
650650
```
651651

652+
```Java
653+
class Solution {
654+
//前缀表(不减一)Java实现
655+
public int strStr(String haystack, String needle) {
656+
if (needle.length() == 0) return 0;
657+
int[] next = new int[needle.length()];
658+
getNext(next, needle);
659+
660+
int j = 0;
661+
for (int i = 0; i < haystack.length(); i++) {
662+
while (j > 0 && needle.charAt(j) != haystack.charAt(i))
663+
j = next[j - 1];
664+
if (needle.charAt(j) == haystack.charAt(i))
665+
j++;
666+
if (j == needle.length())
667+
return i - needle.length() + 1;
668+
}
669+
return -1;
670+
671+
}
672+
673+
private void getNext(int[] next, String s) {
674+
int j = 0;
675+
next[0] = 0;
676+
for (int i = 1; i < s.length(); i++) {
677+
while (j > 0 && s.charAt(j) != s.charAt(i))
678+
j = next[j - 1];
679+
if (s.charAt(j) == s.charAt(i))
680+
j++;
681+
next[i] = j;
682+
}
683+
}
684+
}
685+
```
686+
652687
Python3:
653688

654689
```python

problems/0040.组合总和II.md

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ public:
255255

256256

257257
## Java
258+
**使用标记数组**
258259
```Java
259260
class Solution {
260261
List<List<Integer>> lists = new ArrayList<>();
@@ -292,6 +293,44 @@ class Solution {
292293
}
293294
}
294295
```
296+
**不使用标记数组**
297+
```Java
298+
class Solution {
299+
List<List<Integer>> res = new ArrayList<>();
300+
LinkedList<Integer> path = new LinkedList<>();
301+
int sum = 0;
302+
303+
public List<List<Integer>> combinationSum2( int[] candidates, int target ) {
304+
//为了将重复的数字都放到一起,所以先进行排序
305+
Arrays.sort( candidates );
306+
backTracking( candidates, target, 0 );
307+
return res;
308+
}
309+
310+
private void backTracking( int[] candidates, int target, int start ) {
311+
if ( sum == target ) {
312+
res.add( new ArrayList<>( path ) );
313+
return;
314+
}
315+
for ( int i = start; i < candidates.length && sum + candidates[i] <= target; i++ ) {
316+
//正确剔除重复解的办法
317+
//跳过同一树层使用过的元素
318+
if ( i > start && candidates[i] == candidates[i - 1] ) {
319+
continue;
320+
}
321+
322+
sum += candidates[i];
323+
path.add( candidates[i] );
324+
// i+1 代表当前组内元素只选取一次
325+
backTracking( candidates, target, i + 1 );
326+
327+
int temp = path.getLast();
328+
sum -= temp;
329+
path.removeLast();
330+
}
331+
}
332+
}
333+
```
295334

296335
## Python
297336
**回溯+巧妙去重(省去使用used**
@@ -384,6 +423,7 @@ class Solution:
384423
## Go
385424
主要在于如何在回溯中去重
386425

426+
**使用used数组**
387427
```go
388428
func combinationSum2(candidates []int, target int) [][]int {
389429
var trcak []int
@@ -423,7 +463,41 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int,
423463
}
424464
}
425465
```
426-
466+
**不使用used数组**
467+
```go
468+
func combinationSum2(candidates []int, target int) [][]int {
469+
var trcak []int
470+
var res [][]int
471+
sort.Ints(candidates)
472+
backtracking(0,0,target,candidates,trcak,&res)
473+
return res
474+
}
475+
func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int){
476+
//终止条件
477+
if sum==target{
478+
tmp:=make([]int,len(trcak))
479+
//拷贝
480+
copy(tmp,trcak)
481+
//放入结果集
482+
*res=append(*res,tmp)
483+
return
484+
}
485+
//回溯
486+
for i:=startIndex;i<len(candidates) && sum+candidates[i]<=target;i++{
487+
// 若当前树层有使用过相同的元素,则跳过
488+
if i>startIndex&&candidates[i]==candidates[i-1]{
489+
continue
490+
}
491+
//更新路径集合和sum
492+
trcak=append(trcak,candidates[i])
493+
sum+=candidates[i]
494+
backtracking(i+1,sum,target,candidates,trcak,res)
495+
//回溯
496+
trcak=trcak[:len(trcak)-1]
497+
sum-=candidates[i]
498+
}
499+
}
500+
```
427501
## javaScript
428502

429503
```js

problems/0077.组合.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -422,13 +422,13 @@ class Solution:
422422
def backtrack(n,k,startIndex):
423423
if len(path) == k:
424424
res.append(path[:])
425-
return
425+
return
426426
for i in range(startIndex,n - (k - len(path)) + 2): #优化的地方
427427
path.append(i) #处理节点
428428
backtrack(n,k,i+1) #递归
429429
path.pop() #回溯,撤销处理的节点
430-
backtrack(n,k,1)
431-
return res
430+
backtrack(n,k,1)
431+
return res
432432
```
433433

434434

problems/0077.组合优化.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,13 @@ class Solution:
182182
def backtrack(n,k,startIndex):
183183
if len(path) == k:
184184
res.append(path[:])
185-
return
185+
return
186186
for i in range(startIndex,n-(k-len(path))+2): #优化的地方
187187
path.append(i) #处理节点
188188
backtrack(n,k,i+1) #递归
189189
path.pop() #回溯,撤销处理的节点
190-
backtrack(n,k,1)
191-
return res
190+
backtrack(n,k,1)
191+
return res
192192
```
193193
Go:
194194
```Go

problems/0090.子集II.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ if (i > startIndex && nums[i] == nums[i - 1] ) {
166166

167167

168168
### Java
169-
169+
使用used数组
170170
```java
171171
class Solution {
172172
List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合
@@ -202,6 +202,37 @@ class Solution {
202202
}
203203
```
204204

205+
不使用used数组
206+
```java
207+
class Solution {
208+
209+
List<List<Integer>> res = new ArrayList<>();
210+
LinkedList<Integer> path = new LinkedList<>();
211+
212+
public List<List<Integer>> subsetsWithDup( int[] nums ) {
213+
Arrays.sort( nums );
214+
subsetsWithDupHelper( nums, 0 );
215+
return res;
216+
}
217+
218+
219+
private void subsetsWithDupHelper( int[] nums, int start ) {
220+
res.add( new ArrayList<>( path ) );
221+
222+
for ( int i = start; i < nums.length; i++ ) {
223+
// 跳过当前树层使用过的、相同的元素
224+
if ( i > start && nums[i - 1] == nums[i] ) {
225+
continue;
226+
}
227+
path.add( nums[i] );
228+
subsetsWithDupHelper( nums, i + 1 );
229+
path.removeLast();
230+
}
231+
}
232+
233+
}
234+
```
235+
205236
### Python
206237
```python
207238
class Solution:

problems/0209.长度最小的子数组.md

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public:
107107
};
108108
```
109109

110-
时间复杂度:$O(n)$
110+
时间复杂度:$O(n)$
111111
空间复杂度:$O(1)$
112112

113113
**一些录友会疑惑为什么时间复杂度是$O(n)$**
@@ -121,7 +121,6 @@ public:
121121

122122

123123

124-
125124
## 其他语言版本
126125

127126

@@ -214,6 +213,28 @@ var minSubArrayLen = function(target, nums) {
214213
};
215214
```
216215

216+
Typescript:
217+
218+
```typescript
219+
function minSubArrayLen(target: number, nums: number[]): number {
220+
let left: number = 0, right: number = 0;
221+
let res: number = nums.length + 1;
222+
let sum: number = 0;
223+
while (right < nums.length) {
224+
sum += nums[right];
225+
if (sum >= target) {
226+
// 不断移动左指针,直到不能再缩小为止
227+
while (sum - nums[left] >= target) {
228+
sum -= nums[left++];
229+
}
230+
res = Math.min(res, right - left + 1);
231+
}
232+
right++;
233+
}
234+
return res === nums.length + 1 ? 0 : res;
235+
};
236+
```
237+
217238
Swift:
218239

219240
```swift
@@ -291,5 +312,23 @@ class Solution {
291312
}
292313
```
293314

315+
Ruby:
316+
317+
```ruby
318+
def min_sub_array_len(target, nums)
319+
res = Float::INFINITY # 无穷大
320+
i, sum = 0, 0
321+
nums.length.times do |j|
322+
sum += nums[j]
323+
while sum >= target
324+
res = [res, j - i + 1].min
325+
sum -= nums[i]
326+
i += 1
327+
end
328+
end
329+
res == Float::INFINITY ? 0 : res
330+
end
331+
```
332+
294333
-----------------------
295334
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0216.组合总和III.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,6 @@ class Solution:
323323
self.backtracking(k, n, i + 1)
324324
self.path.pop()
325325
self.sum_now -= i
326-
return
327326
```
328327

329328
## Go

problems/0222.完全二叉树的节点个数.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ return treeNum;
8080
class Solution {
8181
private:
8282
int getNodesNum(TreeNode* cur) {
83-
if (cur == 0) return 0;
83+
if (cur == NULL) return 0;
8484
int leftNum = getNodesNum(cur->left); // 左
8585
int rightNum = getNodesNum(cur->right); // 右
8686
int treeNum = leftNum + rightNum + 1; // 中

0 commit comments

Comments
 (0)