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

Commit 7011c07

Browse files
Update
1 parent 7ff0587 commit 7011c07

7 files changed

+154
-17
lines changed

README.md

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,18 @@
2828
* [这六道哈希表相关的面试题,你一定要会!](https://mp.weixin.qq.com/s/nxuWv5cUhCPSbAdIHtWgSg)
2929
* [关于链表,你该了解这些!](https://mp.weixin.qq.com/s/ntlZbEdKgnFQKZkSUAOSpQ)
3030
* [刷leetcode的时候,究竟什么时候可以使用库函数,什么时候不要使用库函数,过来人来说一说](https://leetcode-cn.com/circle/article/E1Kjzn/)
31+
* [链表:听说用虚拟头节点会方便很多?](https://mp.weixin.qq.com/s/slM1CH5Ew9XzK93YOQYSjA)
32+
* [链表:一道题目考察了常见的五个操作!](https://mp.weixin.qq.com/s/Cf95Lc6brKL4g2j8YyF3Mg)
33+
* [链表:听说过两天反转链表又写不出来了?](https://mp.weixin.qq.com/s/pnvVP-0ZM7epB8y3w_Njwg)
34+
* [链表:环找到了,那入口呢?](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA)
35+
* [哈希表:可以拿数组当哈希表来用,但哈希值不要太大](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig)
3136
* 精选链表相关的面试题
3237
* 精选字符串相关的面试题
3338
* 精选栈与队列相关的面试题
3439
* 精选二叉树相关的面试题
3540
* 精选递归与回溯面试题
3641

42+
3743
(持续更新中....)
3844

3945
# LeetCode 刷题攻略
@@ -50,10 +56,10 @@
5056
* [0059.螺旋矩阵II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0059.螺旋矩阵II.md)
5157

5258
* 链表经典题目
53-
* [0203.移除链表元素](https://github.com/youngyangyang04/leetcode/blob/master/problems/0203.移除链表元素.md)
54-
* [0707.设计链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0707.设计链表.md)
55-
* [0206.翻转链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0206.翻转链表.md)
56-
* [0142.环形链表II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0142.环形链表II.md)
59+
* [0203.移除链表元素](https://mp.weixin.qq.com/s/slM1CH5Ew9XzK93YOQYSjA)
60+
* [0707.设计链表](https://mp.weixin.qq.com/s/Cf95Lc6brKL4g2j8YyF3Mg)
61+
* [0206.翻转链表](https://mp.weixin.qq.com/s/pnvVP-0ZM7epB8y3w_Njwg)
62+
* [0142.环形链表II](https://mp.weixin.qq.com/s/_QVP3IkRZWx9zIpQRgajzA)
5763

5864
* 哈希表经典题目
5965
* [0242.有效的字母异位词](https://github.com/youngyangyang04/leetcode/blob/master/problems/0242.有效的字母异位词.md)
@@ -335,6 +341,7 @@ int countNodes(TreeNode* root) {
335341
|---|---| ---| --- |
336342
|[0001.两数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0001.两数之和.md) | 数组|简单|**暴力** **哈希**|
337343
|[0015.三数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0015.三数之和.md) | 数组 |中等|**双指针** **哈希**|
344+
|[0017.电话号码的字母组合](https://github.com/youngyangyang04/leetcode/blob/master/problems/0017.电话号码的字母组合.md) | 回溯 |中等|**回溯**|
338345
|[0018.四数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0018.四数之和.md) | 数组 |中等|**双指针**|
339346
|[0020.有效的括号](https://github.com/youngyangyang04/leetcode/blob/master/problems/0020.有效的括号.md) ||简单|****|
340347
|[0021.合并两个有序链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0021.合并两个有序链表.md) |链表 |简单|**模拟** |
@@ -345,6 +352,7 @@ int countNodes(TreeNode* root) {
345352
|[0053.最大子序和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0053.最大子序和.md) |数组 |简单|**暴力** **贪心** 动态规划 分治|
346353
|[0059.螺旋矩阵II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0059.螺旋矩阵II.md) |数组 |中等|**模拟**|
347354
|[0083.删除排序链表中的重复元素](https://github.com/youngyangyang04/leetcode/blob/master/problems/0083.删除排序链表中的重复元素.md) |链表 |简单|**模拟**|
355+
|[0093.复原IP地址](https://github.com/youngyangyang04/leetcode/blob/master/problems/0093.复原IP地址) |回溯 |中等|**回溯**|
348356
|[0094.二叉树的中序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0094.二叉树的中序遍历.md) ||中等|**递归** **迭代/栈**|
349357
|[0098.验证二叉搜索树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0098.验证二叉搜索树.md) ||中等|**递归**|
350358
|[0100.相同的树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0100.相同的树.md) ||简单|**递归** |
@@ -353,6 +361,7 @@ int countNodes(TreeNode* root) {
353361
|[0104.二叉树的最大深度](https://github.com/youngyangyang04/leetcode/blob/master/problems/0104.二叉树的最大深度.md) ||简单|**递归** **迭代/队列/BFS**|
354362
|[0110.平衡二叉树](https://github.com/youngyangyang04/leetcode/blob/master/problems/0110.平衡二叉树.md) ||简单|**递归**|
355363
|[0111.二叉树的最小深度](https://github.com/youngyangyang04/leetcode/blob/master/problems/0111.二叉树的最小深度.md) ||简单|**递归** **队列/BFS**|
364+
|[0131.分割回文串](https://github.com/youngyangyang04/leetcode/blob/master/problems/0131.分割回文串.md) |回溯 |中等|**回溯**|
356365
|[0142.环形链表II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0142.环形链表II.md) |链表 |中等|**快慢指针/双指针**|
357366
|[0144.二叉树的前序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0144.二叉树的前序遍历.md) ||中等|**递归** **迭代/栈**|
358367
|[0145.二叉树的后序遍历](https://github.com/youngyangyang04/leetcode/blob/master/problems/0145.二叉树的后序遍历.md) ||困难|**递归** **迭代/栈**|

pics/93_复原IP地址.png

43.4 KB
Loading

problems/0083.删除排序链表中的重复元素.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,5 @@ public:
3636
};
3737
```
3838

39-
> 更过算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。
39+
> 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。
4040

problems/0093.复原IP地址.md

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
## 题目地址
2+
https://leetcode-cn.com/problems/restore-ip-addresses/
3+
4+
## 思路
5+
6+
7+
## C++代码
8+
9+
```
10+
class Solution {
11+
private:
12+
vector<string> result;// 记录结果
13+
// startIndex: 搜索的起始位置,pointNum:添加逗点的数量
14+
void search(string& s, int startIndex, int pointNum) {
15+
if (pointNum == 3) { // 逗点数量为3时,分隔结束
16+
// 判断第四段子字符串是否合法,如果合法就放进result中
17+
if (isValid(s, startIndex, s.size() - 1)) {
18+
result.push_back(s);
19+
}
20+
return;
21+
}
22+
// 从起始位置开始构造字段字符串串
23+
for (int i = startIndex; i < s.size(); i++) {
24+
// 判断 [startIndex,i] 这个区间的子串是否合法
25+
if (isValid(s, startIndex, i)) {
26+
// 合法,在i的后面插入一个逗点
27+
s.insert(s.begin() + i + 1 , '.');
28+
// 插入逗点之后下一个子串的起始位置为i+2
29+
search(s, i + 2, pointNum + 1);
30+
s.erase(s.begin() + i + 1); // 回溯时删掉逗点
31+
} else break;
32+
}
33+
}
34+
// 判断字符串s在左闭又闭区间[start, end]所组成的数字是否合法
35+
bool isValid(const string& s, int start, int end) {
36+
if (start > end) {
37+
return false;
38+
}
39+
if (s[start] == '0' && start != end) {// 0开头的数字不合法
40+
return false;
41+
}
42+
int num = 0;
43+
for (int i = start; i <= end; i++) {
44+
if (s[i] > '9' || s[i] < '0') { // 遇到非数字字符不合法
45+
return false;
46+
}
47+
num = num * 10 + (s[i] - '0');
48+
if (num > 255) { // 如果大于255了不合法
49+
return false;
50+
}
51+
}
52+
return true;
53+
}
54+
public:
55+
vector<string> restoreIpAddresses(string s) {
56+
result.clear();
57+
search(s, 0, 0);
58+
return result;
59+
}
60+
};
61+
```
62+
63+
> 更多算法干货文章持续更新,可以微信搜索「代码随想录」第一时间围观,关注后,回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等,就可以获得我多年整理的学习资料。

problems/0131.分割回文串.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
2+
## 题目地址
3+
https://leetcode-cn.com/problems/palindrome-partitioning/
4+
5+
## 思路
6+
7+
8+
## C++代码
9+
```
10+
class Solution {
11+
private:
12+
vector<vector<string>> result;
13+
14+
// startIndex: 搜索的起始位置,vec: 放已经回文的子串
15+
void search(const string& s, int startIndex, vector<string>& vec) {
16+
// 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了
17+
if (startIndex >= s.size()) {
18+
result.push_back(vec);
19+
return;
20+
}
21+
for (int i = startIndex; i < s.size(); i++) {
22+
if (isPalindrome(s, startIndex, i)) { // 是回文子串
23+
// 获取[startIndex,i]在s中的子串
24+
string str = s.substr(startIndex, i - startIndex + 1);
25+
vec.push_back(str);
26+
} else { // 如果不是则直接跳过
27+
continue;
28+
}
29+
search(s, i + 1, vec); // 寻找i+1为起始位置的子串
30+
vec.pop_back(); // 回溯过程,弹出本次已经填在的子串
31+
}
32+
}
33+
bool isPalindrome(const string& s, int start, int end) {
34+
for (int i = start, j = end; i < j; i++, j--) {
35+
if (s[i] != s[j]) {
36+
return false;
37+
}
38+
}
39+
return true;
40+
}
41+
public:
42+
vector<vector<string>> partition(string s) {
43+
result.clear();
44+
vector<string> vec;
45+
search(s, 0 , vec);
46+
return result;
47+
}
48+
};
49+
```

problems/0349.两个数组的交集.md

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,35 @@
22
## 题目地址
33
https://leetcode-cn.com/problems/intersection-of-two-arrays/
44

5-
## 思路
5+
> 如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费!
66
7-
这道题目,主要要学会使用一种哈希数据结构,unordered_set,这个数据结构可以解决很多类似的问题。
7+
# 第349题. 两个数组的交集
8+
9+
题意:给定两个数组,编写一个函数来计算它们的交集。
10+
11+
![349. 两个数组的交集](https://img-blog.csdnimg.cn/20200818193523911.png)
12+
13+
**说明:**
14+
输出结果中的每个元素一定是唯一的。
15+
我们可以不考虑输出结果的顺序。
16+
17+
# 思路
18+
19+
这道题目,主要要学会使用一种哈希数据结构:unordered_set,这个数据结构可以解决很多类似的问题。
820

921
注意题目特意说明:**输出结果中的每个元素一定是唯一的,也就是说输出的结果的去重的, 同时可以不考虑输出结果的顺序**
1022

11-
这道题用暴力的解法时间复杂度是O(n^2),这种解法面试官一定不会满意,那看看使用哈希法进一步优化。
23+
这道题用暴力的解法时间复杂度是O(n^2),那来看看使用哈希法进一步优化。
24+
25+
可以发现,貌似用数组做哈希表可以解决这道题目,把nums1的元素,映射到哈希数组的下表上,然后在遍历nums2的时候,判断是否出现过就可以了。
1226

13-
那么可以发现,貌似用数组做哈希表可以解决这道题目,把nums1的元素,映射到哈希数组的下表上,然后在遍历nums2的时候,判断是否出现过就可以了。
27+
但是要注意,**使用数据来做哈希的题目,都限制了数值的大小,例如[哈希表:可以拿数组当哈希表来用,但哈希值不要太大](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig)题目中只有小写字母,或者数值大小在[0- 10000] 之内等等。**
1428

15-
但是要注意,使用数据来做哈希的题目,都限制了数值的大小,例如只有小写字母,或者数值大小在[0- 10000] 之内等等。 而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
29+
而这道题目没有限制数值的大小,就无法使用数组来做哈希表了。
1630

17-
例如说:如果我的输入样例是这样的, 难道要定义一个2亿大小的数组来做哈希表么, 不同的语言对数组定义的大小都是有限制的, 即使有的语言可以定义这么大的数组,那也是对内存空间造成了非常大的浪费。
31+
**而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。**
1832

19-
此时就要使用另一种结构体了,set ,关于set,C++ 给提供了如下三种可用的数据结构
33+
此时就要使用另一种结构体了,set ,关于set,C++ 给提供了如下三种可用的数据结构
2034

2135
* std::set
2236
* std::multiset
@@ -25,9 +39,10 @@ https://leetcode-cn.com/problems/intersection-of-two-arrays/
2539
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
2640

2741
思路如图所示:
42+
2843
![set哈希法](https://img-blog.csdnimg.cn/2020080918570417.png)
2944

30-
## 代码
45+
# C++代码
3146
```
3247
class Solution {
3348
public:

problems/0383.赎金信.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ https://leetcode-cn.com/problems/ransom-note/
33

44
## 思路
55

6-
这道题题意很清晰,就是用判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成,但是这里需要注意两点1.
6+
这道题目和[242.有效的字母异位词](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig)很像,[242.有效的字母异位词](https://mp.weixin.qq.com/s/vM6OszkM6L1Mx2Ralm9Dig)相当于求 字符串a 和 字符串b 是否可以相互组成 ,而这道题目是求 字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。
7+
8+
本题判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成,但是这里需要注意两点1.
79

810
*  第一点“为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思”  这里*说明杂志里面的字母不可重复使用。*
911

@@ -37,13 +39,12 @@ public:
3739
};
3840
```
3941
40-
这里时间复杂度是比较高的,而且里面还有一个字符串删除也就是erase的操作,也是费时的,当然这段代码也可以过这道题
42+
这里时间复杂度是比较高的,而且里面还有一个字符串删除也就是erase的操作,也是费时的,当然这段代码也可以过这道题
4143
42-
我们想一想优化解法
4344
4445
## 字典计数法(哈希策略)
4546
46-
因为题目所只有小写字母,那我们可以采用空间换区时间的哈希策略, 用一个长度为26的数组还记录magazine里字母出现的次数,然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。
47+
因为题目所只有小写字母,那可以采用空间换区时间的哈希策略, 用一个长度为26的数组还记录magazine里字母出现的次数,然后再用ransomNote去验证这个数组是否包含了ransomNote所需要的所有字母。
4748
代码如下:
4849
4950
```C++

0 commit comments

Comments
 (0)