Skip to content

Commit ac97f77

Browse files
committed
更新题解列表
1 parent 90b477b commit ac97f77

17 files changed

+453
-131
lines changed

Solutions/0037. 解数独.md

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,47 @@
55

66
## 题目大意
77

8-
给定一个二维的字符数组 `board` 用来表示数独,其中数字 `1-9` 表示该位置已经填入了数字,`.` 表示该位置还没有填入数字。
8+
**描述**给定一个二维的字符数组 $board$ 用来表示数独,其中数字 $1 \sim 9$ 表示该位置已经填入了数字,`.` 表示该位置还没有填入数字。
99

10-
现在编写一个程序,通过填充空格的方式来解决数独问题,最终不用返回答案,将题目给定 `board` 修改为可行的方案即可。
10+
**要求**现在编写一个程序,通过填充空格的方式来解决数独问题,最终不用返回答案,将题目给定 $board$ 修改为可行的方案即可。
1111

12-
数独解法需遵循如下规则
12+
**说明**
1313

14-
- 数字 `1-9` 在每一行只能出现一次。
15-
- 数字 `1-9` 在每一列只能出现一次。
16-
- 数字 `1-9` 在每一个以粗直线分隔的 `3 * 3` 宫格内只能出现一次。
14+
- 数独解法需遵循如下规则:
15+
16+
- 数字 $1 \sim 9$ 在每一行只能出现一次。
17+
- 数字 $1 \sim 9$ 在每一列只能出现一次。
18+
- 数字 $1 \sim 9$ 在每一个以粗直线分隔的 $3 \times 3$ 宫格内只能出现一次。
19+
- $board.length == 9$。
20+
- $board[i].length == 9$。
21+
- $board[i][j]$ 是一位数字或者 `.`
22+
- 题目数据保证输入数独仅有一个解。
23+
24+
**示例**
25+
26+
- 示例 1:
27+
28+
![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/04/12/250px-sudoku-by-l2g-20050714svg.png)
29+
30+
```python
31+
输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]
32+
输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]]
33+
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:
34+
```
1735

1836
![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2021/04/12/250px-sudoku-by-l2g-20050714_solutionsvg.png)
1937

2038
## 解题思路
2139

22-
使用回溯算法求解。对于每一行、每一列、每一个数字,都需要 1 重 for 循环来遍历,这样就是 3 重 for 循环。
23-
24-
对于第 i 行、第 j 列的元素来说,如果当前位置为空位,则尝试将第 k 个数字置于此处,并检验数独的有效性。如果有效,则继续遍历下一个空位,直到遍历完所有空位,得到可行方案或者遍历失败时结束。
40+
### 思路 1:回溯算法
2541

26-
遍历完下一个空位之后再将此位置进行回退,置为 `.`
42+
对于每一行、每一列、每一个数字,都需要一重 `for` 循环来遍历,这样就是三重 `for` 循环
2743

44+
对于第 $i$ 行、第 $j$ 列的元素来说,如果当前位置为空位,则尝试将第 $k$ 个数字置于此处,并检验数独的有效性。如果有效,则继续遍历下一个空位,直到遍历完所有空位,得到可行方案或者遍历失败时结束。
2845

46+
遍历完下一个空位之后再将此位置进行回退,置为 `.`
2947

30-
## 代码
48+
### 思路 1:代码
3149

3250
```python
3351
class Solution:
@@ -70,3 +88,8 @@ class Solution:
7088
"""
7189
```
7290

91+
### 思路 1:复杂度分析
92+
93+
- **时间复杂度**:$O(9^m)$,$m$ 为棋盘中 `.` 的数量。
94+
- **空间复杂度**:$O(9^2)$。
95+

Solutions/0079. 单词搜索.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
## 题目大意
77

8-
**描述**:给定一个 $m \times n$ 大小的二维字符矩阵 `board` 和一个字符串单词 `word`
8+
**描述**:给定一个 $m \times n$ 大小的二维字符矩阵 $board$ 和一个字符串单词 $word$
99

10-
**要求**:如果 `word` 存在于网格中,返回 `True`,否则返回 `False`
10+
**要求**:如果 $word$ 存在于网格中,返回 `True`,否则返回 `False`
1111

1212
**说明**
1313

@@ -16,7 +16,7 @@
1616
- $n == board[i].length$。
1717
- $1 \le m, n \le 6$。
1818
- $1 \le word.length \le 15$。
19-
- `board``word` 仅由大小写英文字母组成。
19+
- $board$$word$ 仅由大小写英文字母组成。
2020

2121
**示例**
2222

@@ -42,9 +42,9 @@
4242

4343
### 思路 1:回溯算法
4444

45-
使用回溯算法在二维矩阵 `board` 中按照上下左右四个方向递归搜索。
45+
使用回溯算法在二维矩阵 $board$ 中按照上下左右四个方向递归搜索。
4646

47-
设函数 `backtrack(i, j, index)` 表示从 `board[i][j]` 出发,能否搜索到单词字母 `word[index]`,以及 `index` 位置之后的后缀子串。如果能搜索到,则返回 `True`,否则返回 `False`
47+
设函数 `backtrack(i, j, index)` 表示从 $board[i][j]$ 出发,能否搜索到单词字母 $word[index]$,以及 $index$ 位置之后的后缀子串。如果能搜索到,则返回 `True`,否则返回 `False`
4848

4949
`backtrack(i, j, index)` 执行步骤如下:
5050

@@ -88,6 +88,6 @@ class Solution:
8888

8989
### 思路 1:复杂度分析
9090

91-
- **时间复杂度**:$O(m \times n \times 2^l)$,其中 $m$、$n$ 为二维矩阵 `board`的行数和列数。$l$ 为字符串 `word` 的长度。
91+
- **时间复杂度**:$O(m \times n \times 2^l)$,其中 $m$、$n$ 为二维矩阵 $board$的行数和列数。$l$ 为字符串 $word$ 的长度。
9292
- **空间复杂度**:$O(m \times n)$。
9393

Solutions/0089. 格雷编码.md

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,58 @@
55

66
## 题目大意
77

8-
- 格雷编码:二进制数字系统,两个连续的数值仅有一个位数的差异
8+
**描述**:给定一个整数 $n$
99

10-
现在给定一个代表格雷编码总位数的非负整数 `n`,打印对应的格雷编码序列。只需要返回其中一个答案即可。
10+
**要求**:返回任一有效的 $n$ 位格雷码序列。
11+
12+
**说明**
13+
14+
- **n 位格雷码序列**:是一个由 $2^n$ 个整数组成的序列,其中:
15+
- 每个整数都在范围 $[0, 2^n - 1]$ 内(含 $0$ 和 $2^n - 1$)。
16+
- 第一个整数是 $0$。
17+
- 一个整数在序列中出现不超过一次。
18+
- 每对相邻整数的二进制表示恰好一位不同 ,且第一个和最后一个整数的二进制表示恰好一位不同。
19+
20+
- $1 \le n \le 16$。
21+
22+
**示例**
23+
24+
- 示例 1:
25+
26+
```python
27+
输入:n = 2
28+
输出:[0,1,3,2]
29+
解释:
30+
[0,1,3,2] 的二进制表示是 [00,01,11,10] 。
31+
- 0001 有一位不同
32+
- 0111 有一位不同
33+
- 1110 有一位不同
34+
- 1000 有一位不同
35+
[0,2,3,1] 也是一个有效的格雷码序列,其二进制表示是 [00,10,11,01] 。
36+
- 0010 有一位不同
37+
- 1011 有一位不同
38+
- 1101 有一位不同
39+
- 0100 有一位不同
40+
```
41+
42+
- 示例 2:
43+
44+
```python
45+
输入:n = 1
46+
输出:[0,1]
47+
```
1148

1249
## 解题思路
1350

14-
- 格雷编码生成规则:以二进制值为 `0` 的格雷编码作为第 `0` 项,第一次改变最右边的数位,第二次改变从右边数第一个为 `1` 的数位左边的数位,第三次跟第一次一样,改变最右边的数位,第四次跟第二次一样,改变从右边数第一个为 `1` 的数位左边的数位。此后,第五、六次,第七、八次 ... 都跟第一二次一样反复进行,直到生成 $2^n$​ 个格雷编码。
51+
### 思路 1:位运算 + 公式法
52+
53+
- 格雷编码生成规则:以二进制值为 $0$ 的格雷编码作为第 $0$ 项,第一次改变最右边的数位,第二次改变从右边数第一个为 $1$ 的数位左边的数位,第三次跟第一次一样,改变最右边的数位,第四次跟第二次一样,改变从右边数第一个为 $1$ 的数位左边的数位。此后,第五、六次,第七、八次 ... 都跟第一二次一样反复进行,直到生成 $2^n$​ 个格雷编码。
1554

1655
- 也可以直接利用二进制转换为格雷编码公式:
1756

1857
![image.png](https://pic.leetcode-cn.com/1013850d7f6c8cf1d99dc0ac3292264b74f6a52d84e0215f540c80952e184f41-image.png)
1958

20-
## 代码
59+
### 思路 1:代码
2160

2261
```python
2362
class Solution:
@@ -29,3 +68,8 @@ class Solution:
2968
binary += 1
3069
return gray
3170
```
71+
72+
### 思路 1:复杂度分析
73+
74+
- **时间复杂度**:$O(2^n)$。
75+
- **空间复杂度**:$O(1)$。

Solutions/0338. 比特位计数.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,33 +37,33 @@
3737

3838
根据整数的二进制特点可以将整数分为两类:
3939

40-
- 奇数:其二进制表示中 `1` 的个数一定比前面相邻的偶数多一个 `1`
41-
- 偶数:其二进制表示中 `1` 的个数一定与该数除以 `2` 之后的数一样多。
40+
- 奇数:其二进制表示中 $1$ 的个数一定比前面相邻的偶数多一个 $1$
41+
- 偶数:其二进制表示中 $1$ 的个数一定与该数除以 $2$ 之后的数一样多。
4242

43-
另外,边界 `0` 的二进制表示中 `1` 的个数为 `0`
43+
另外,边界 $0$ 的二进制表示中 $1$ 的个数为 $0$
4444

45-
于是可以根据规律,从 `0` 开始到 `n` 进行递推求解。
45+
于是可以根据规律,从 $0$ 开始到 $n$ 进行递推求解。
4646

4747
###### 1. 划分阶段
4848

49-
按照整数 `n` 进行阶段划分。
49+
按照整数 $n$ 进行阶段划分。
5050

5151
###### 2. 定义状态
5252

53-
定义状态 `dp[i]` 表示为:整数 `i` 对应二进制表示中 `1` 的个数。
53+
定义状态 $dp[i]$ 表示为:整数 $i$ 对应二进制表示中 $1$ 的个数。
5454

5555
###### 3. 状态转移方程
5656

57-
- 如果 `i` 为奇数,则整数 `i` 对应二进制表示中 `1` 的个数等于整数 `i - 1` 对应二进制表示中 `1` 的个数加 `1`,即 `dp[i] = dp[i - 1] + 1`
58-
- 如果 `i` 为偶数,则整数 `i` 对应二进制表示中 `1` 的个数等于整数 `i // 2` 对应二进制表示中 `1` 的个数,即 `dp[i] = dp[i // 2]`
57+
- 如果 $i$ 为奇数,则整数 $i$ 对应二进制表示中 $1$ 的个数等于整数 $i - 1$ 对应二进制表示中 $1$ 的个数加 $1$,即 $dp[i] = dp[i - 1] + 1$
58+
- 如果 $i$ 为偶数,则整数 $i$ 对应二进制表示中 $1$ 的个数等于整数 $i // 2$ 对应二进制表示中 $1$ 的个数,即 $dp[i] = dp[i // 2]$
5959

6060
###### 4. 初始条件
6161

62-
整数 `0` 对应二进制表示中 `1` 的个数为 `0`
62+
整数 $0$ 对应二进制表示中 $1$ 的个数为 $0$
6363

6464
###### 5. 最终结果
6565

66-
整个 `dp` 数组即为最终结果,将其返回即可。
66+
整个 $dp$ 数组即为最终结果,将其返回即可。
6767

6868
### 思路 1:动态规划代码
6969

Solutions/0371. 两整数之和.md

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,51 @@
55

66
## 题目大意
77

8-
不使用运算符 `+``-` ,计算两整数 `a``b` 之和。
8+
**描述**:给定两个整数 $a$ 和 $b$。
9+
10+
**要求**:不使用运算符 `+``-` ,计算两整数 $a$ 和 $b$ 的和。
11+
12+
**说明**
13+
14+
- $-1000 \le a, b \le 1000$。
15+
16+
**示例**
17+
18+
- 示例 1:
19+
20+
```python
21+
输入:a = 1, b = 2
22+
输出:3
23+
```
24+
25+
- 示例 2:
26+
27+
```python
28+
输入:a = 2, b = 3
29+
输出:5
30+
```
931

1032
## 解题思路
1133

34+
### 思路 1:位运算
35+
1236
需要用到位运算的一些知识。
1337

14-
- 异或运算 a ^ b :可以获得 a + b 无进位的加法结果。
15-
- 与运算 a & b:对应位置为 1,说明 a、b 该位置上原来都为 1,则需要进位。
16-
- 座椅运算 a << 1:将 a 对应二进制数左移 1 位。
38+
- 异或运算 `a ^ b`:可以获得 $a + b$ 无进位的加法结果。
39+
- 与运算 `a & b`:对应位置为 $1$,说明 $a$、$b$ 该位置上原来都为 $1$,则需要进位。
40+
- 左移运算 `a << 1`:将 $a$ 对应二进制数左移 $1$ 位。
1741

18-
这样,通过 a^b 运算,我们可以得到相加后无进位结果,再根据 (a&b) << 1,计算进位后结果。
42+
这样,通过 `a ^ b` 运算,我们可以得到相加后无进位结果,再根据 `(a & b) << 1`,计算进位后结果。
1943

20-
进行 a^b(a&b) << 1操作之后判断进位是否为 0,若不为 0,则继续上一步操作,直到进位为 0
44+
进行 `a ^ b``(a & b) << 1` 操作之后判断进位是否为 $0$,若不为 $0$,则继续上一步操作,直到进位为 $0$
2145

2246
> 注意:
2347
>
24-
> Python 的整数类型是无限长整数类型,负数不确定符号位是第几位。所以我们可以将输入的数字手动转为 32 位无符号整数。
48+
> Python 的整数类型是无限长整数类型,负数不确定符号位是第几位。所以我们可以将输入的数字手动转为 $32$ 位无符号整数。
2549
>
26-
> 通过 a &= 0xFFFFFFFF 即可将 a 转为 32 位无符号整数。最后通过对 a 的范围判断,将其结果映射为有符号整数。
50+
> 通过 `a &= 0xFFFFFFFF` 即可将 $a$ 转为 $32$ 位无符号整数。最后通过对 $a$ 的范围判断,将其结果映射为有符号整数。
2751
28-
## 代码
52+
### 思路 1:代码
2953

3054
```python
3155
class Solution:
@@ -44,3 +68,8 @@ class Solution:
4468
return ~(a ^ MASK)
4569
```
4670

71+
### 思路 1:复杂度分析
72+
73+
- **时间复杂度**:$O(\log k)$,其中 $k$ 为 $int$ 所能表达的最大整数。
74+
- **空间复杂度**:$O(1)$。
75+

Solutions/0392. 判断子序列.md

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,44 @@
55

66
## 题目大意
77

8-
给定字符串 `s``t` ,判断 `s` 是否为 `t` 的子序列。
8+
**描述**:给定字符串 $s$ 和 $t$。
9+
10+
**要求**:判断 $s$ 是否为 $t$ 的子序列。
11+
12+
**说明**
13+
14+
- $0 \le s.length \le 100$。
15+
- $0 \le t.length \le 10^4$。
16+
- 两个字符串都只由小写字符组成。
17+
18+
**示例**
19+
20+
- 示例 1:
21+
22+
```python
23+
输入:s = "abc", t = "ahbgdc"
24+
输出:True
25+
```
26+
27+
- 示例 2:
28+
29+
```python
30+
输入:s = "axc", t = "ahbgdc"
31+
输出:False
32+
```
933

1034
## 解题思路
1135

12-
双指针
36+
### 思路 1:双指针
1337

14-
使用两个指针 `i``j` 分别指向字符串 `s``t`,然后对两个字符串进行遍历。
38+
使用两个指针 $i$、$j$ 分别指向字符串 $s$$t$,然后对两个字符串进行遍历。
1539

16-
- 遇到 `s[i] == t[j]` 的情况,则 `i` 向右移。
17-
- 不断右移 `j`
18-
- 如果超过 `s``t` 的长度则跳出。
19-
- 最后判断指针 `i` 是否指向了 `s` 的末尾,即:判断 `i` 是否等于 `s` 的长度。如果等于,则说明 `s``t` 的子序列,如果不等于,则不是。
40+
- 遇到 $s[i] == t[j]$ 的情况,则 $i$ 向右移。
41+
- 不断右移 $j$
42+
- 如果超过 $s$$t$ 的长度则跳出。
43+
- 最后判断指针 $i$ 是否指向了 $s$ 的末尾,即:判断 $i$ 是否等于 $s$ 的长度。如果等于,则说明 $s$$t$ 的子序列,如果不等于,则不是。
2044

21-
## 代码
45+
### 思路 1:代码
2246

2347
```python
2448
class Solution:
@@ -33,3 +57,8 @@ class Solution:
3357
return i == size_s
3458
```
3559

60+
### 思路 1:复杂度分析
61+
62+
- **时间复杂度**:$O(n + m)$,其中 $n$、$m$ 分别为字符串 $s$、$t$ 的长度。
63+
- **空间复杂度**:$O(1)$。
64+

0 commit comments

Comments
 (0)