Skip to content

Commit 7d6790e

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents 23e979a + 0a2a5b1 commit 7d6790e

File tree

96 files changed

+3481
-1118
lines changed

Some content is hidden

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

96 files changed

+3481
-1118
lines changed

README.md

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
</a>
1313

1414
<p align="center">
15-
<a href="https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ"><img src="https://img.shields.io/badge/知识星球-代码随想录-blue" alt=""></a>
15+
<a href="https://mp.weixin.qq.com/s/RsdcQ9umo09R6cfnwXZlrQ"><img src="https://img.shields.io/badge/PDF下载-代码随想录-blueviolet" alt=""></a>
1616
<a href="https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw"><img src="https://img.shields.io/badge/刷题-微信群-green" alt=""></a>
17-
<a href="https://img-blog.csdnimg.cn/20201210231711160.png"><img src="https://img.shields.io/badge/公众号-代码随想录-brightgreen" alt=""></a>
1817
<a href="https://space.bilibili.com/525438321"><img src="https://img.shields.io/badge/B站-代码随想录-orange" alt=""></a>
18+
<a href="https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ"><img src="https://img.shields.io/badge/知识星球-代码随想录-blue" alt=""></a>
1919
</p>
2020

2121
# LeetCode 刷题攻略
@@ -112,14 +112,24 @@
112112

113113
(持续更新中.....)
114114

115+
## 备战秋招
116+
117+
1. [选择方向的时候,我也迷茫了](https://mp.weixin.qq.com/s/ZCzFiAHZHLqHPLJQXNm75g)
118+
2. [刷题就用库函数了,怎么了?](https://mp.weixin.qq.com/s/6K3_OSaudnHGq2Ey8vqYfg)
119+
3. [关于实习,大家可能有点迷茫!](https://mp.weixin.qq.com/s/xcxzi7c78kQGjvZ8hh7taA)
120+
4. [马上秋招了,慌得很!](https://mp.weixin.qq.com/s/7q7W8Cb2-a5U5atZdOnOFA)
121+
5. [Carl看了上百份简历,总结了这些!](https://mp.weixin.qq.com/s/sJa87MZD28piCOVMFkIbwQ)
122+
6. [面试中遇到了发散性问题.....](https://mp.weixin.qq.com/s/SSonDxi2pjkSVwHNzZswng)
123+
115124
## 数组
116125

117126
1. [数组过于简单,但你该了解这些!](./problems/数组理论基础.md)
118127
2. [数组:每次遇到二分法,都是一看就会,一写就废](./problems/0704.二分查找.md)
119128
3. [数组:就移除个元素很难么?](./problems/0027.移除元素.md)
120-
4. [数组:滑动窗口拯救了你](./problems/0209.长度最小的子数组.md)
121-
5. [数组:这个循环可以转懵很多人!](./problems/0059.螺旋矩阵II.md)
122-
6. [数组:总结篇](./problems/数组总结篇.md)
129+
4. [数组:有序数组的平方,还有序么?](./problems/0977.有序数组的平方.md)
130+
5. [数组:滑动窗口拯救了你](./problems/0209.长度最小的子数组.md)
131+
6. [数组:这个循环可以转懵很多人!](./problems/0059.螺旋矩阵II.md)
132+
7. [数组:总结篇](./problems/数组总结篇.md)
123133

124134
## 链表
125135

@@ -292,6 +302,7 @@
292302

293303
动态规划专题已经开始啦,来不及解释了,小伙伴们上车别掉队!
294304

305+
<img src='https://code-thinking.cdn.bcebos.com/pics/动态规划-总结大纲1.jpg' width=500> </img></div>
295306
1. [关于动态规划,你该了解这些!](./problems/动态规划理论基础.md)
296307
2. [动态规划:斐波那契数](./problems/0509.斐波那契数.md)
297308
3. [动态规划:爬楼梯](./problems/0070.爬楼梯.md)
@@ -366,6 +377,7 @@
366377
52. [为了绝杀编辑距离,Carl做了三步铺垫,你都知道么?](./problems/为了绝杀编辑距离,卡尔做了三步铺垫.md)
367378
53. [动态规划:回文子串](./problems/0647.回文子串.md)
368379
54. [动态规划:最长回文子序列](./problems/0516.最长回文子序列.md)
380+
55. [动态规划总结篇](./problems/动态规划总结篇.md)
369381

370382

371383
(持续更新中....)
@@ -390,12 +402,7 @@
390402

391403
[各类基础算法模板](https://github.com/youngyangyang04/leetcode/blob/master/problems/算法模板.md)
392404

393-
# 备战秋招
394405

395-
1. [技术比较弱,也对技术不感兴趣,如何选择方向?](https://mp.weixin.qq.com/s/ZCzFiAHZHLqHPLJQXNm75g)
396-
2. [刷题就用库函数了,怎么了?](https://mp.weixin.qq.com/s/6K3_OSaudnHGq2Ey8vqYfg)
397-
3. [关于实习,大家可能有点迷茫!](https://mp.weixin.qq.com/s/xcxzi7c78kQGjvZ8hh7taA)
398-
4. [马上秋招了,慌得很!](https://mp.weixin.qq.com/s/7q7W8Cb2-a5U5atZdOnOFA)
399406

400407
# B站算法视频讲解
401408

problems/0001.两数之和.md

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,17 @@ https://leetcode-cn.com/problems/two-sum/
2929
很明显暴力的解法是两层for循环查找,时间复杂度是O(n^2)。
3030

3131
建议大家做这道题目之前,先做一下这两道
32-
* [242. 有效的字母异位词](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig)
33-
* [349. 两个数组的交集](https://mp.weixin.qq.com/s/N9iqAchXreSVW7zXUS4BVA)
32+
* [242. 有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)
33+
* [349. 两个数组的交集](https://mp.weixin.qq.com/s/aMSA5zrp3jJcLjuSB0Es2Q)
3434

35-
[242. 有效的字母异位词](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig) 这道题目是用数组作为哈希表来解决哈希问题,[349. 两个数组的交集](https://mp.weixin.qq.com/s/N9iqAchXreSVW7zXUS4BVA)这道题目是通过set作为哈希表来解决哈希问题。
35+
[242. 有效的字母异位词](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA) 这道题目是用数组作为哈希表来解决哈希问题,[349. 两个数组的交集](https://mp.weixin.qq.com/s/aMSA5zrp3jJcLjuSB0Es2Q)这道题目是通过set作为哈希表来解决哈希问题。
3636

3737
本题呢,则要使用map,那么来看一下使用数组和set来做哈希法的局限。
3838

3939
* 数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。
40-
* set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。所以set 也不能用。
40+
* set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下表位置,因为要返回x 和 y的下表。所以set 也不能用。
4141

42-
此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下标
42+
此时就要选择另一种数据结构:map ,map是一种key value的存储结构,可以用key保存数值,用value在保存数值所在的下表
4343

4444
C++中map,有三种类型:
4545

@@ -51,13 +51,12 @@ C++中map,有三种类型:
5151

5252
std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。
5353

54-
同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 更多哈希表的理论知识请看[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/g8N6WmoQmsCUw3_BaWxHZA)
54+
同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。 更多哈希表的理论知识请看[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)
5555

5656
**这道题目中并不需要key有序,选择std::unordered_map 效率更高!**
5757

5858
解题思路动画如下:
5959

60-
6160
![](https://code-thinking.cdn.bcebos.com/gifs/1.两数之和.gif)
6261

6362

@@ -136,6 +135,21 @@ func twoSum(nums []int, target int) []int {
136135
}
137136
```
138137

138+
```go
139+
// 使用map方式解题,降低时间复杂度
140+
func twoSum(nums []int, target int) []int {
141+
m := make(map[int]int)
142+
for index, val := range nums {
143+
if preIndex, ok := m[target-val]; ok {
144+
return []int{preIndex, index}
145+
} else {
146+
m[val] = index
147+
}
148+
}
149+
return []int{}
150+
}
151+
```
152+
139153
Rust
140154

141155
```rust

problems/0015.三数之和.md

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,7 @@ public:
105105
106106
时间复杂度:O(n^2)。
107107
108-
109-
## 双指针法C++代码
108+
C++代码代码如下:
110109
111110
```C++
112111
class Solution {
@@ -163,13 +162,14 @@ public:
163162

164163
# 思考题
165164

166-
既然三数之和可以使用双指针法,我们之前讲过的[两数之和](https://mp.weixin.qq.com/s/uVAtjOHSeqymV8FeQbliJQ),可不可以使用双指针法呢?
165+
166+
既然三数之和可以使用双指针法,我们之前讲过的[1.两数之和](https://mp.weixin.qq.com/s/vaMsLnH-f7_9nEK4Cuu3KQ),可不可以使用双指针法呢?
167167

168168
如果不能,题意如何更改就可以使用双指针法呢? **大家留言说出自己的想法吧!**
169169

170-
两数之和 就不能使用双指针法,因为[两数之和](https://mp.weixin.qq.com/s/uVAtjOHSeqymV8FeQbliJQ)要求返回的是索引下表, 而双指针法一定要排序,一旦排序之后原数组的索引就被改变了。
170+
两数之和 就不能使用双指针法,因为[1.两数之和](https://mp.weixin.qq.com/s/vaMsLnH-f7_9nEK4Cuu3KQ)要求返回的是索引下表, 而双指针法一定要排序,一旦排序之后原数组的索引就被改变了。
171171

172-
如果[两数之和](https://mp.weixin.qq.com/s/uVAtjOHSeqymV8FeQbliJQ)要求返回的是数值的话,就可以使用双指针法了。
172+
如果[1.两数之和](https://mp.weixin.qq.com/s/vaMsLnH-f7_9nEK4Cuu3KQ)要求返回的是数值的话,就可以使用双指针法了。
173173

174174

175175

@@ -336,6 +336,23 @@ var threeSum = function(nums) {
336336
```
337337

338338

339+
ruby:
340+
```ruby
341+
def is_valid(strs)
342+
symbol_map = {')' => '(', '}' => '{', ']' => '['}
343+
stack = []
344+
strs.size.times {|i|
345+
c = strs[i]
346+
if symbol_map.has_key?(c)
347+
top_e = stack.shift
348+
return false if symbol_map[c] != top_e
349+
else
350+
stack.unshift(c)
351+
end
352+
}
353+
stack.empty?
354+
end
355+
```
339356

340357
-----------------------
341358
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)

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

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ for (int i = 0; i < letters.size(); i++) {
137137
关键地方都讲完了,按照[关于回溯算法,你该了解这些!](https://mp.weixin.qq.com/s/gjSgJbNbd1eAA5WkA-HeWw)中的回溯法模板,不难写出如下C++代码:
138138

139139

140-
```
140+
```c++
141141
// 版本一
142142
class Solution {
143143
private:
@@ -183,7 +183,7 @@ public:
183183
184184
一些写法,是把回溯的过程放在递归函数里了,例如如下代码,我可以写成这样:(注意注释中不一样的地方)
185185
186-
```
186+
```c++
187187
// 版本二
188188
class Solution {
189189
private:
@@ -319,7 +319,7 @@ class Solution:
319319

320320
python3:
321321

322-
```python3
322+
```py
323323
class Solution:
324324
def letterCombinations(self, digits: str) -> List[str]:
325325
self.s = ""
@@ -342,6 +342,33 @@ class Solution:
342342

343343
Go:
344344

345+
javaScript:
346+
347+
```js
348+
var letterCombinations = function(digits) {
349+
const k = digits.length;
350+
const map = ["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"];
351+
if(!k) return [];
352+
if(k === 1) return map[digits].split("");
353+
354+
const res = [], path = [];
355+
backtracking(digits, k, 0);
356+
return res;
357+
358+
function backtracking(n, k, a) {
359+
if(path.length === k) {
360+
res.push(path.join(""));
361+
return;
362+
}
363+
for(const v of map[n[a]]) {
364+
path.push(v);
365+
backtracking(n, k, a + 1);
366+
path.pop();
367+
}
368+
369+
}
370+
};
371+
```
345372

346373

347374

problems/0018.四数之和.md

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,38 +31,39 @@ https://leetcode-cn.com/problems/4sum/
3131

3232
# 思路
3333

34-
四数之和,和[三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A)是一个思路,都是使用双指针法, 基本解法就是在[三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A) 的基础上再套一层for循环。
34+
四数之和,和[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)是一个思路,都是使用双指针法, 基本解法就是在[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg) 的基础上再套一层for循环。
3535

3636
但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。(大家亲自写代码就能感受出来)
3737

38-
[三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下表作为双指针,找到nums[i] + nums[left] + nums[right] == 0。
38+
[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下表作为双指针,找到nums[i] + nums[left] + nums[right] == 0。
3939

4040
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下表作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3) 。
4141

4242
那么一样的道理,五数之和、六数之和等等都采用这种解法。
4343

44-
对于[三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A)双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。
44+
对于[15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)双指针法就是将原本暴力O(n^3)的解法,降为O(n^2)的解法,四数之和的双指针解法就是将原本暴力O(n^4)的解法,降为O(n^3)的解法。
4545

46-
之前我们讲过哈希表的经典题目:[四数相加II](https://mp.weixin.qq.com/s/Ue8pKKU5hw_m-jPgwlHcbA),相对于本题简单很多,因为本题是要求在一个集合中找出四个数相加等于target,同时四元组不能重复。
46+
之前我们讲过哈希表的经典题目:[454.四数相加II](https://mp.weixin.qq.com/s/12g_w6RzHuEpFts1pT6BWw),相对于本题简单很多,因为本题是要求在一个集合中找出四个数相加等于target,同时四元组不能重复。
4747

48-
[四数相加II](https://mp.weixin.qq.com/s/Ue8pKKU5hw_m-jPgwlHcbA)是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于本题还是简单了不少!
48+
[454.四数相加II](https://mp.weixin.qq.com/s/12g_w6RzHuEpFts1pT6BWw)是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于本题还是简单了不少!
4949

5050
我们来回顾一下,几道题目使用了双指针法。
5151

5252
双指针法将时间复杂度O(n^2)的解法优化为 O(n)的解法。也就是降一个数量级,题目如下:
53-
* [0027.移除元素](https://mp.weixin.qq.com/s/wj0T-Xs88_FHJFwayElQlA)
54-
* [15.三数之和](https://mp.weixin.qq.com/s/r5cgZFu0tv4grBAexdcd8A)
55-
* [18.四数之和](https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g)
5653

57-
双指针来记录前后指针实现链表反转:
54+
* [27.移除元素](https://mp.weixin.qq.com/s/RMkulE4NIb6XsSX83ra-Ww)
55+
* [15.三数之和](https://mp.weixin.qq.com/s/QfTNEByq1YlNSXRKEumwHg)
56+
* [18.四数之和](https://mp.weixin.qq.com/s/nQrcco8AZJV1pAOVjeIU_g)
5857

59-
* [206.反转链表](https://mp.weixin.qq.com/s/pnvVP-0ZM7epB8y3w_Njwg)
6058

61-
使用双指针来确定有环
59+
操作链表
6260

63-
* [142题.环形链表II](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA)
61+
* [206.反转链表](https://mp.weixin.qq.com/s/ckEvIVGcNLfrz6OLOMoT0A)
62+
* [19.删除链表的倒数第N个节点](https://mp.weixin.qq.com/s/gxu65X1343xW_sBrkTz0Eg)
63+
* [面试题 02.07. 链表相交](https://mp.weixin.qq.com/s/BhfFfaGvt9Zs7UmH4YehZw)
64+
* [142题.环形链表II](https://mp.weixin.qq.com/s/gt_VH3hQTqNxyWcl1ECSbQ)
6465

65-
双指针法在数组和链表中还有很多应用,后面还会介绍到。
66+
双指针法在字符串题目中还有很多应用,后面还会介绍到。
6667

6768
C++代码
6869

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,30 @@ class Solution {
112112
}
113113
}
114114
```
115+
116+
Python:
117+
```python
118+
# Definition for singly-linked list.
119+
# class ListNode:
120+
# def __init__(self, val=0, next=None):
121+
# self.val = val
122+
# self.next = next
123+
class Solution:
124+
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
125+
head_dummy = ListNode()
126+
head_dummy.next = head
127+
128+
slow, fast = head_dummy, head_dummy
129+
while(n!=0): #fast先往前走n步
130+
fast = fast.next
131+
n -= 1
132+
while(fast.next!=None):
133+
slow = slow.next
134+
fast = fast.next
135+
#fast 走到结尾后,slow的下一个节点为倒数第N个节点
136+
slow.next = slow.next.next #删除
137+
return head_dummy.next
138+
```
115139
Go:
116140
```Go
117141
/**

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,23 @@ class Solution {
129129
```
130130

131131
Python:
132+
```python
133+
class Solution:
134+
def swapPairs(self, head: ListNode) -> ListNode:
135+
dummy = ListNode(0) #设置一个虚拟头结点
136+
dummy.next = head
137+
cur = dummy
138+
while cur.next and cur.next.next:
139+
tmp = cur.next #记录临时节点
140+
tmp1 = cur.next.next.next #记录临时节点
141+
142+
cur.next = cur.next.next #步骤一
143+
cur.next.next = tmp #步骤二
144+
cur.next.next.next = tmp1 #步骤三
145+
146+
cur = cur.next.next #cur移动两位,准备下一轮交换
147+
return dummy.next
148+
```
132149

133150
Go:
134151
```go

problems/0027.移除元素.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,36 @@ var removeElement = (nums, val) => {
186186
};
187187
```
188188

189+
Ruby:
190+
```ruby
191+
def remove_element(nums, val)
192+
i = 0
193+
nums.each_index do |j|
194+
if nums[j] != val
195+
nums[i] = nums[j]
196+
i+=1
197+
end
198+
end
199+
i
200+
end
201+
```
202+
Rust:
203+
```rust
204+
pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> &mut Vec<i32> {
205+
let mut start: usize = 0;
206+
while start < nums.len() {
207+
if nums[start] == val {
208+
nums.remove(start);
209+
}
210+
start += 1;
211+
}
212+
nums
213+
}
214+
fn main() {
215+
let mut nums = vec![5,1,3,5,2,3,4,1];
216+
println!("{:?}",remove_element(&mut nums, 5));
217+
}
218+
```
189219
-----------------------
190220
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
191221
* B站视频:[代码随想录](https://space.bilibili.com/525438321)

0 commit comments

Comments
 (0)