Skip to content

Commit e1d94ba

Browse files
author
lixiang.2533
committed
add new answers
Change-Id: Idf4b89eb4446642cdc7345b914b690aad97c73a2
1 parent b16c901 commit e1d94ba

9 files changed

+156
-22
lines changed

二分法/278. 第一个错误的版本.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,4 @@ class Solution:
5757

5858
Tips
5959

60-
依旧是二分法,强迫症执着的
60+
依旧是二分法,强迫症执着的使用左右闭区间,这个时候想要知道最后返回的是左还是右区间只要模拟一下推出的挺狂求可以

值得二刷.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
- 回溯
2+
- 491
3+
- 39
4+
- 二分
5+
- 81
6+
- 153
7+
- 链表
8+
- 82
9+
- 61
10+
- 206
11+
-
12+
- 239
13+
- 215/剑指offer40
14+
- 双指针
15+
- 贪心
16+
- 数组
17+
- 哈希表
18+
-
19+
- 动态规划

双指针/0.双指针总结.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
- [ ] 88 合并两个有序数组
3535
- [ ] 844 比较含退格的字符串
3636
- [ ] 977 有序数组的平方
37+
- [ ]
3738

3839
- 技巧
3940
- [ ] 28 实现 strStr() :KMP算法

双指针/264.丑数II.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
给你一个整数 n ,请你找出并返回第 n 个 丑数 。
2+
3+
丑数 就是只包含质因数 2、3 和/或 5 的正整数。
4+
5+
6+
7+
示例 1:
8+
9+
10+
输入:n = 10
11+
输出:12
12+
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
13+
14+
15+
示例 2:
16+
17+
18+
输入:n = 1
19+
输出:1
20+
解释:1 通常被视为丑数。
21+
22+
23+
24+
25+
提示:
26+
27+
28+
1 <= n <= 1690
29+
30+
```python
31+
class Solution:
32+
def nthUglyNumber(self, n: int) -> int:
33+
ans = [0] * (n+1)
34+
ans[1] = 1
35+
idx1, idx2,idx3 = 1,1,1
36+
idx = 2
37+
while idx<=n:
38+
a,b,c = ans[idx1] * 2, ans[idx2]*3, ans[idx3]*5
39+
m = min(a,b,c)
40+
if m==a:
41+
idx1+=1
42+
if m==b:
43+
idx2+=1
44+
if m==c:
45+
idx3+=1
46+
ans[idx]=m
47+
idx+=1
48+
print(ans)
49+
return ans[n]
50+
```
51+
52+
53+
54+
55+
56+
Tips
57+
58+
1. 归并排序问题,这里放在双指针了,因为需要三个指针分别指向丑数*2, 丑数*3,丑数*5下一个最小的位置,合并是每次选择最小的并移动指针
59+
2. 需要注意的是因为同一个丑数可能来源于不同的指针,例如6,同时是丑数2的倍数,也是丑数3的倍数,所以指针移动时是不是互斥的

回溯/0.回溯算法总结.md

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,45 @@
11
回溯是一种搜索方式,主要用来寻找所有解的可能,回溯都依赖递归实现,属于递归的一个方向。一般抽象为多叉树的深度搜索问题,候选集的大小是树的宽度,target是树的深度。空间复杂度一般是深度搜索的深度。时间复杂度不定,不过回溯并不高效
22
- 求所有组合:有重复数组,无重复数组(可/不可重复取)
3-
- 17 电话号码的字母组合:无重复,一次使用
4-
- 39 组合总和:无重复,反复使用,sort剪枝
5-
- 40 组合总和 II:有重复,sort,判断去重
6-
- 77 组合:无重复,一次使用
7-
- 216 组合总和 III:求和为n,注意遍历右边界要包括n
8-
- 22 括号生成:left+right counter判断是否生成右括号
3+
- [ ] 17 电话号码的字母组合:无重复,一次使用
4+
- [ ] 22 括号生成:left+right counter判断是否生成右括号
5+
- [ ] 39 组合总和:无重复,反复使用,sort剪枝
6+
- [ ] 40 组合总和 II:有重复,sort,判断去重
7+
- [ ] 77 组合:无重复,一次使用
8+
- [ ] 216 组合总和 III:求和为n,注意遍历右边界要包括n
9+
- [ ] 784 字母大小写全排列:特殊递归条件
10+
911
- 空间复杂度O(n):递归的深度
10-
- 时间复杂度O(2^n*n): 虽然题目各不相同,基本不存在重复遍历所以是组合数量
12+
13+
- 时间复杂度O(2^n*n): 虽然题目各不相同,基本不存在重复遍历所以是组合数量 * 组合长度,是一个宽松上街
14+
1115
- 求所有排列:数组有/无重复
12-
- 46 全排列: 无重复,递归包含自己
13-
- 47 全排列 II:有重复,sort,判断去重
16+
- [ ] 46 全排列: 无重复,递归包含自己
17+
- [ ] 47 全排列 II:有重复,sort,判断去重
18+
1419
- 空间复杂度O(n):递归的深度
15-
- 时间复杂度O(n!):排列的数量
20+
- 时间复杂度O(n!):排列的数量
21+
1622
- 分割问题:把字符串/数组按要求分割
17-
- 131 分割回文串:在组合的基础上,加一步是否回文的判断
18-
- 93 复原 IP 地址:在组合的基础上,加一步是否满足IP的判断
23+
- [ ] 131 分割回文串:在组合的基础上,加一步是否回文的判断
24+
- [ ] 93 复原 IP 地址:在组合的基础上,加一步是否满足IP的判断
25+
1926
- 空间复杂度O(n)
20-
- 时间复杂度
27+
- 时间复杂度O(2^n*n)
28+
2129
- 求子集
22-
- 78 子集:无重复,在组合的基础上,每一步都append result
23-
- 90 子集 II:有重复,同上
30+
- [ ] 78 子集:无重复,在组合的基础上,每一步都append result
31+
- [ ] 90 子集 II:有重复,同上
32+
2433
- 空间复杂度O(n):和组合相同
2534
- 时间复杂度O(2^n*n): 和组合相同
35+
2636
- 求子序列
27-
- 491 递增子序列:注意是按原顺序递增,因为不能sort,所以只能通过set来判断解是否重复
37+
- [ ] 491 递增子序列:注意是按原顺序递增,因为不能sort,所以只能通过set来判断解是否重复
38+
- [ ] 784 字母大小写全排列:只需要区分字母/非字母进行递归
39+
2840
- 空间复杂度O(n)
29-
- 时间复杂度
41+
- 时间复杂度O(2^n*n)
42+
3043
- 回溯问题模版
3144
- 停止条件
3245
- 递归方式
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
2+
3+
4+
5+
示例:
6+
输入:S = "a1b2"
7+
输出:["a1b2", "a1B2", "A1b2", "A1B2"]
8+
9+
输入:S = "3z4"
10+
输出:["3z4", "3Z4"]
11+
12+
输入:S = "12345"
13+
输出:["12345"]
14+
15+
16+
17+
18+
提示:
19+
20+
21+
S 的长度不超过12。
22+
S 仅由数字和字母组成。
23+
24+
25+
26+
```python
27+
class Solution:
28+
def letterCasePermutation(self, s: str) -> List[str]:
29+
result = []
30+
def dfs(s, path):
31+
if not s:
32+
result.append(path)
33+
return
34+
if s[0].isalpha():
35+
dfs(s[1:], path+s[0].lower())
36+
dfs(s[1:], path + s[0].upper())
37+
else:
38+
dfs(s[1:], path+s[0])
39+
dfs(s, '')
40+
return result
41+
```
42+

栈/0.栈总结.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,11 @@
2929

3030
- [ ] 42 接雨水:单调栈,需要左中右三个元素来计算雨水
3131
- [ ] 239 滑动窗口最大值:滑动窗口+单调队列
32+
- [ ] 264 丑数II:优先队列
3233
- [ ] 316 去除重复字母:单调栈+贪心,对越高的位置优先保留更大/更小
3334
- [ ] 402 移掉K位数字:单调栈+贪心,对越高的位置优先保留更大/更小
3435
- [ ] 496 下一个更大元素 I:单调栈,哈希存储
3536
- [ ] 503 下一个更大元素 II:单调栈, 数组存储(数组有重复),循环用遍历2*len的方式实现
3637
- [ ] 1438 绝对差不超过限制的最长连续子数组: 滑动窗口+最大最小两个单调队列
37-
38+
3839

链表/82. 删除排序链表中的重复元素 II.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,4 @@ class Solution:
4949
Tips
5050

5151
1. 永远机制链表不能对当前节点进行修改,只能修改next
52-
2. 这里因为要判断连续两个元素是否重复,所以要保留两个指针位置node.next和node.next.next
53-
3. 且当发现存在重复元素师不要移动指针位置,只是继续向前判断知道发现不重复的元素,改变link,然后继续判断。只有当确认玄素不重复的时候才移动指针位置
52+
3. 注意只有当不重复的时候才会移动指针位置

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,4 @@ class Solution:
4949
Tips
5050

5151
1. 链表注意事项永远记得保留head
52-
2. 每一步都是调整当前节点的link,所以head=head.next一定要放在后面做不然pointer就已经离开当前节点了
52+
2. 注意只有当不重复的时候才会移动指针位置

0 commit comments

Comments
 (0)