Skip to content

Commit a8eb3b8

Browse files
Merge branch 'master' into master
2 parents 494a24f + 77dc120 commit a8eb3b8

37 files changed

+1026
-94
lines changed

README.md

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,17 @@
2323

2424
很多刚开始刷题的同学都有一个困惑:面对leetcode上近两千道题目,从何刷起。
2525

26+
大家平时刷题感觉效率低,浪费的时间主要在三点:
27+
28+
* 找题
29+
* 找到了不应该现阶段做的题
30+
* 没有全套的优质题解可以参考
31+
2632
其实我之前在知乎上回答过这个问题,回答内容大概是按照如下类型来刷数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。
2733

2834
但我能设身处地的感受到:即使有这样一个整体规划,对于一位初学者甚至算法老手寻找合适自己的题目也是很困难,时间成本很高,而且题目还不一定就是经典题目。
2935

30-
对于刷题,我们都是想用最短的时间把经典题目都做一篇,这样效率才是最高的!
36+
对于刷题,我们都是想用最短的时间**按照循序渐进的难度顺序把经典题目都做一遍**,这样效率才是最高的!
3137

3238
所以我整理了leetcode刷题攻略:一个超级详细的刷题顺序,**每道题目都是我精心筛选,都是经典题目高频面试题**,大家只要按照这个顺序刷就可以了,**你没看错,就是题目顺序都排好了,文章顺序就是刷题顺序!挨个刷就可以,不用自己再去题海里选题了!**
3339

@@ -49,15 +55,18 @@
4955

5056
**目前已经更新了,数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心,八个专题了,正在讲解动态规划!**
5157

52-
在刷题指南中,每个专题开始都有理论基础篇,并不像是教科书般的理论介绍,而是从实战中归纳需要的基础知识。每个专题结束都有总结篇,最这个专题的归纳总结。
58+
在刷题攻略中,每个专题开始都有理论基础篇,并不像是教科书般的理论介绍,而是从实战中归纳需要的基础知识。每个专题结束都有总结篇,最这个专题的归纳总结。
5359

5460
如果你是算法老手,这篇攻略也是复习的最佳资料,如果把每个系列对应的总结篇,快速过一遍,整个算法知识体系以及各种解法就重现脑海了。
5561

56-
在按照如下顺序刷题的过程中,每一道题解一定要看对应文章下面的留言(留言目前只能在手机端查看)。
5762

58-
如果你有疑问或者发现文章哪里有不对的地方,都可以在留言区都能找到答案,还有很多录友的总结非常赞,看完之后也很有收获。
63+
目前「代码随想录」刷题攻略更新了:**200多篇文章,精讲了200道经典算法题目,共60w字的详细图解,部分难点题目还搭配了20分钟左右的视频讲解**
64+
65+
**这里每一篇题解,都是精品,值得仔细琢磨**
66+
67+
我在题目讲解中统一用C++语言,但你会发现下面几乎每篇题解都配有其他语言版本,Java、Python、Go、JavaScript等等,这正是热心小伙们的贡献的代码,当然我也会严格把控代码质量。
5968

60-
目前「代码随想录」刷题指南更新了:**200多篇文章,精讲了200道经典算法题目,共60w字的详细图解,部分难点题目还搭配了20分钟左右的视频讲解**
69+
**所以也欢迎大家参与进来,完善题解的各个语言版本,拥抱开源,让更多小伙伴们收益**
6170

6271
准备好了么,刷题攻略开始咯,go go go!
6372

@@ -66,7 +75,7 @@
6675
## 前序
6776

6877
* [「代码随想录」后序安排](https://mp.weixin.qq.com/s/4eeGJREy6E-v6D7cR_5A4g)
69-
* [「代码随想录」学习社区](https://mp.weixin.qq.com/s/X1XCH-KevURi3LnakJsCkA)
78+
* [「代码随想录」学习社区](https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ)
7079

7180

7281
* 编程语言
@@ -119,8 +128,9 @@
119128
4. [链表:听说过两天反转链表又写不出来了?](./problems/0206.翻转链表.md)
120129
5. [链表:两两交换链表中的节点](./problems/0024.两两交换链表中的节点.md)
121130
6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
122-
7. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
123-
8. [链表:总结篇!](./problems/链表总结篇.md)
131+
7. [链表:链表相交](./problems/面试题02.07.链表相交.md)
132+
8. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
133+
9. [链表:总结篇!](./problems/链表总结篇.md)
124134

125135
## 哈希表
126136

@@ -156,11 +166,13 @@
156166
3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md)
157167
4. [字符串:花式反转还不够!](./problems/0151.翻转字符串里的单词.md)
158168
5. [链表:听说过两天反转链表又写不出来了?](./problems/0206.翻转链表.md)
159-
6. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
160-
7. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
161-
8. [哈希表:解决了两数之和,那么能解决三数之和么?](./problems/0015.三数之和.md)
162-
9. [双指针法:一样的道理,能解决四数之和](./problems/0018.四数之和.md)
163-
10. [双指针法:总结篇!](./problems/双指针总结.md)
169+
6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
170+
7. [链表:链表相交](./problems/面试题02.07.链表相交.md)
171+
8. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
172+
9. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
173+
10. [哈希表:解决了两数之和,那么能解决三数之和么?](./problems/0015.三数之和.md)
174+
11. [双指针法:一样的道理,能解决四数之和](./problems/0018.四数之和.md)
175+
12. [双指针法:总结篇!](./problems/双指针总结.md)
164176

165177
## 栈与队列
166178

problems/0020.有效的括号.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,33 @@ class Solution {
162162
return deque.isEmpty();
163163
}
164164
}
165+
// 方法2
166+
class Solution {
167+
public boolean isValid(String s) {
168+
169+
Stack<Character> stack = new Stack<>();
170+
Map<Character, Character> map = new HashMap<Character, Character>() {
171+
{
172+
put('}', '{');
173+
put(']', '[');
174+
put(')', '(');
175+
}
176+
};
177+
178+
for (Character c : s.toCharArray()) { // 顺序读取字符
179+
if (!stack.isEmpty() && map.containsKey(c)) { // 是右括号 && 栈不为空
180+
if (stack.peek() == map.get(c)) { // 取其对应的左括号直接和栈顶比
181+
stack.pop(); // 相同则抵消,出栈
182+
} else {
183+
return false; // 不同则直接返回
184+
}
185+
} else {
186+
stack.push(c); // 左括号,直接入栈
187+
}
188+
}
189+
return stack.isEmpty(); // 看左右是否抵消完
190+
}
191+
}
165192
```
166193

167194
Python:

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

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,46 @@ public:
8787

8888
Java:
8989

90+
```Java
91+
// 递归版本
92+
class Solution {
93+
public ListNode swapPairs(ListNode head) {
94+
// base case 退出提交
95+
if(head == null || head.next == null) return head;
96+
// 获取当前节点的下一个节点
97+
ListNode next = head.next;
98+
// 进行递归
99+
ListNode newNode = swapPairs(next.next);
100+
// 这里进行交换
101+
next.next = head;
102+
head.next = newNode;
103+
104+
return next;
105+
}
106+
}
107+
```
108+
109+
```java
110+
// 虚拟头结点
111+
class Solution {
112+
public ListNode swapPairs(ListNode head) {
113+
114+
ListNode dummyNode = new ListNode(0);
115+
dummyNode.next = head;
116+
ListNode prev = dummyNode;
117+
118+
while (prev.next != null && prev.next.next != null) {
119+
ListNode temp = head.next.next; // 缓存 next
120+
prev.next = head.next; // 将 prev 的 next 改为 head 的 next
121+
head.next.next = head; // 将 head.next(prev.next) 的next,指向 head
122+
head.next = temp; // 将head 的 next 接上缓存的temp
123+
prev = head; // 步进1位
124+
head = head.next; // 步进1位
125+
}
126+
return dummyNode.next;
127+
}
128+
}
129+
```
90130

91131
Python:
92132

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public:
116116

117117
**大家要仔细看注释,思考为什么要写while(left <= right), 为什么要写right = middle - 1**
118118

119-
```
119+
```C++
120120
class Solution {
121121
public:
122122
int searchInsert(vector<int>& nums, int target) {
@@ -158,7 +158,7 @@ public:
158158
159159
**大家要仔细看注释,思考为什么要写while (left < right), 为什么要写right = middle**。
160160
161-
```
161+
```C++
162162
class Solution {
163163
public:
164164
int searchInsert(vector<int>& nums, int target) {

problems/0045.跳跃游戏II.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,22 @@ class Solution {
175175
```
176176

177177
Python:
178-
178+
```python
179+
class Solution:
180+
def jump(self, nums: List[int]) -> int:
181+
if len(nums) == 1: return 0
182+
ans = 0
183+
curDistance = 0
184+
nextDistance = 0
185+
for i in range(len(nums)):
186+
nextDistance = max(i + nums[i], nextDistance)
187+
if i == curDistance:
188+
if curDistance != len(nums) - 1:
189+
ans += 1
190+
curDistance = nextDistance
191+
if nextDistance >= len(nums) - 1: break
192+
return ans
193+
```
179194

180195
Go:
181196

problems/0046.全排列.md

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ public:
149149
Java:
150150
```java
151151
class Solution {
152+
152153
List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合
153154
LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果
154155
boolean[] used;
@@ -167,9 +168,6 @@ class Solution {
167168
return;
168169
}
169170
for (int i = 0; i < nums.length; i++){
170-
// if (path.contains(nums[i])){
171-
// continue;
172-
// }
173171
if (used[i]){
174172
continue;
175173
}
@@ -187,6 +185,26 @@ Python:
187185

188186

189187
Go:
188+
```Go
189+
var result [][]int
190+
func backtrack(nums,pathNums []int,used []bool){
191+
if len(nums)==len(pathNums){
192+
tmp:=make([]int,len(nums))
193+
copy(tmp,pathNums)
194+
result=append(result,tmp)
195+
//result=append(result,pathNums)
196+
return
197+
}
198+
for i:=0;i<len(nums);i++{
199+
if !used[i]{
200+
used[i]=true
201+
pathNums=append(pathNums,nums[i])
202+
backtrack(nums,pathNums,used)
203+
pathNums=pathNums[:len(pathNums)-1]
204+
used[i]=false
205+
}
206+
}
207+
}
190208

191209
Javascript:
192210
```Javascript

problems/0047.全排列II.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public:
8585
path.clear();
8686
sort(nums.begin(), nums.end()); // 排序
8787
vector<bool> used(nums.size(), false);
88-
backtracking(nums, vec, used);
88+
backtracking(nums, used);
8989
return result;
9090
}
9191
};

problems/0051.N皇后.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,72 @@ Python:
363363

364364

365365
Go:
366+
```Go
367+
import "strings"
368+
var res [][]string
369+
370+
func isValid(board [][]string, row, col int) (res bool){
371+
n := len(board)
372+
for i:=0; i < row; i++ {
373+
if board[i][col] == "Q" {
374+
return false
375+
}
376+
}
377+
for i := 0; i < n; i++{
378+
if board[row][i] == "Q" {
379+
return false
380+
}
381+
}
382+
383+
for i ,j := row, col; i >= 0 && j >=0 ; i, j = i - 1, j- 1{
384+
if board[i][j] == "Q"{
385+
return false
386+
}
387+
}
388+
for i, j := row, col; i >=0 && j < n; i,j = i-1, j+1 {
389+
if board[i][j] == "Q" {
390+
return false
391+
}
392+
}
393+
return true
394+
}
395+
396+
func backtrack(board [][]string, row int) {
397+
size := len(board)
398+
if row == size{
399+
temp := make([]string, size)
400+
for i := 0; i<size;i++{
401+
temp[i] = strings.Join(board[i],"")
402+
}
403+
res =append(res,temp)
404+
return
405+
}
406+
for col := 0; col < size; col++ {
407+
if !isValid(board, row, col){
408+
continue
409+
}
410+
board[row][col] = "Q"
411+
backtrack(board, row+1)
412+
board[row][col] = "."
413+
}
414+
}
366415

416+
func solveNQueens(n int) [][]string {
417+
res = [][]string{}
418+
board := make([][]string, n)
419+
for i := 0; i < n; i++{
420+
board[i] = make([]string, n)
421+
}
422+
for i := 0; i < n; i++{
423+
for j := 0; j<n;j++{
424+
board[i][j] = "."
425+
}
426+
}
427+
backtrack(board, 0)
428+
429+
return res
430+
}
431+
```
367432

368433

369434

problems/0053.最大子序和.md

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -175,31 +175,25 @@ class Solution:
175175
```
176176

177177
Go:
178-
```Go
179-
func maxSubArray(nums []int) int {
180-
if len(nums)<1{
181-
return 0
182-
}
183-
dp:=make([]int,len(nums))
184-
result:=nums[0]
185-
dp[0]=nums[0]
186-
for i:=1;i<len(nums);i++{
187-
dp[i]=max(dp[i-1]+nums[i],nums[i])
188-
result=max(dp[i],result)
189-
}
190-
return result
191-
}
192178

193-
func max(a,b int)int{
194-
if a>b{
195-
return a
196-
}else{
197-
return b
179+
```go
180+
func maxSubArray(nums []int) int {
181+
maxSum := nums[0]
182+
for i := 1; i < len(nums); i++ {
183+
if nums[i] + nums[i-1] > nums[i] {
184+
nums[i] += nums[i-1]
185+
}
186+
if nums[i] > maxSum {
187+
maxSum = nums[i]
188+
}
198189
}
190+
return maxSum
199191
}
200192
```
201193

202194

195+
196+
203197
-----------------------
204198
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
205199
* B站视频:[代码随想录](https://space.bilibili.com/525438321)

0 commit comments

Comments
 (0)