Skip to content

Commit eea9d75

Browse files
committed
更新题解列表
1 parent 4f25194 commit eea9d75

13 files changed

Lines changed: 250 additions & 118 deletions

Solutions/0091. 解码方法.md

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

66
## 题目大意
77

8-
**描述**:给定一个数字字符串 `s`。该字符串已经按照下面的映射关系进行了编码:
8+
**描述**:给定一个数字字符串 $s$。该字符串已经按照下面的映射关系进行了编码:
99

10-
- `A` 映射为 `1`
11-
- `B` 映射为 `2`
10+
- `A` 映射为 $1$
11+
- `B` 映射为 $2$
1212
- ...
13-
- `Z` 映射为 `26`
13+
- `Z` 映射为 $26$
1414

15-
基于上述映射的方法,现在对字符串 `s` 进行「解码」。即从数字到字母进行反向映射。比如 `"11106"` 可以映射为:
15+
基于上述映射的方法,现在对字符串 $s$ 进行「解码」。即从数字到字母进行反向映射。比如 `"11106"` 可以映射为:
1616

17-
- `"AAJF"`,将消息分组为 `(1 1 10 6)`
18-
- `"KJF"`,将消息分组为 `(11 10 6)`
17+
- `"AAJF"`,将消息分组为 $(1 1 10 6)$
18+
- `"KJF"`,将消息分组为 $(11 10 6)$
1919

2020
**要求**:计算出共有多少种可能的解码方案。
2121

2222
**说明**
2323

2424
- $1 \le s.length \le 100$。
25-
- `s` 只包含数字,并且可能包含前导零。
26-
- 题目数据保证答案肯定是一个 `32` 位的整数。
25+
- $s$ 只包含数字,并且可能包含前导零。
26+
- 题目数据保证答案肯定是一个 $32$ 位的整数。
2727

2828
**示例**
2929

@@ -45,14 +45,14 @@
4545

4646
###### 2. 定义状态
4747

48-
定义状态 `dp[i]` 表示为:字符串 `s``i` 个字符构成的字符串可能构成的翻译方案数。
48+
定义状态 $dp[i]$ 表示为:字符串 $s$$i$ 个字符构成的字符串可能构成的翻译方案数。
4949

5050
###### 3. 状态转移方程
5151

52-
`dp[i]` 的来源有两种情况:
52+
$dp[i]$ 的来源有两种情况:
5353

54-
1. 使用了一个字符,对 `s[i]` 进行翻译。只要 `s[i] != 0`,就可以被翻译为 `A` ~ `I` 的某个字母,此时方案数为 `dp[i] = dp[i - 1]`
55-
2. 使用了两个字符,对 `s[i - 1]``s[i]` 进行翻译,只有 `s[i - 1] != 0`,且 `s[i - 1]``s[i]` 组成的整数必须小于等于 `26` 才能翻译,可以翻译为 `J` ~ `Z` 中的某字母,此时方案数为 `dp[i] = dp[i - 2]`
54+
1. 使用了一个字符,对 $s[i]$ 进行翻译。只要 $s[i] != 0$,就可以被翻译为 `A` ~ `I` 的某个字母,此时方案数为 $dp[i] = dp[i - 1]$
55+
2. 使用了两个字符,对 $s[i - 1]$$s[i]$ 进行翻译,只有 $s[i - 1] != 0$,且 $s[i - 1]$$s[i]$ 组成的整数必须小于等于 $26$ 才能翻译,可以翻译为 `J` ~ `Z` 中的某字母,此时方案数为 $dp[i] = dp[i - 2]$
5656

5757
这两种情况有可能是同时存在的,也有可能都不存在。在进行转移的时候,将符合要求的方案数累加起来即可。
5858

@@ -62,12 +62,12 @@ $dp[i] += \begin{cases} \begin{array} \ dp[i-1] & s[i] \ne 0 \cr dp[i-2] & s[i-
6262

6363
###### 4. 初始条件
6464

65-
- 字符串为空时,只有一个翻译方案,翻译为空字符串,即 `dp[0] = 1`
66-
- 字符串只有一个字符时,需要考虑该字符是否为 `0`,不为 `0` 的话,`dp[1] = 1`,为 `0` 的话,`dp[0] = 0`
65+
- 字符串为空时,只有一个翻译方案,翻译为空字符串,即 $dp[0] = 1$
66+
- 字符串只有一个字符时,需要考虑该字符是否为 $0$,不为 $0$ 的话,$dp[1] = 1$,为 $0$ 的话,$dp[0] = 0$
6767

6868
###### 5. 最终结果
6969

70-
根据我们之前定义的状态,`dp[i]` 表示为:字符串 `s``i` 个字符构成的字符串可能构成的翻译方案数。则最终结果为 `dp[size]``size` 为字符串长度。
70+
根据我们之前定义的状态,$dp[i]$ 表示为:字符串 $s$$i$ 个字符构成的字符串可能构成的翻译方案数。则最终结果为 $dp[size]$,$size$ 为字符串长度。
7171

7272

7373
### 思路 1:动态规划代码

Solutions/0095. 不同的二叉搜索树 II.md

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

66
## 题目大意
77

8-
给定一个整数 `n`,请返回以 `1``n` 为节点构成的「二叉搜索树」,可以按任意顺序返回答案。
8+
**描述**:给定一个整数 $n$。
9+
10+
**要求**:请生成返回以 $1$ 到 $n$ 为节点构成的「二叉搜索树」,可以按任意顺序返回答案。
11+
12+
**说明**
13+
14+
- $1 \le n \le 8$。
15+
16+
**示例**
17+
18+
- 示例 1:
19+
20+
![](https://assets.leetcode.com/uploads/2021/01/18/uniquebstn3.jpg)
21+
22+
```python
23+
输入:n = 3
24+
输出:[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,null,2],[3,2,null,1]]
25+
```
26+
27+
- 示例 2:
28+
29+
```python
30+
输入:n = 1
31+
输出:[[1]]
32+
```
933

1034
## 解题思路
1135

12-
如果根节点为 `i`,则左子树的节点为 `(1, 2, ..., i - 1)`,右子树的节点为 `(i + 1, i + 2, ..., n)`。可以递归的构建二叉树。
36+
### 思路 1:递归遍历
37+
38+
如果根节点为 $i$,则左子树的节点为 $(1, 2, ..., i - 1)$,右子树的节点为 $(i + 1, i + 2, ..., n)$。可以递归的构建二叉树。
1339

14-
定义递归函数 `generateTrees(start, end)`,表示生成 `[left, ..., right]` 构成的所有可能的二叉搜索树。
40+
定义递归函数 `generateTrees(start, end)`,表示生成 $[left, ..., right]$ 构成的所有可能的二叉搜索树。
1541

16-
- 如果 `start > end`,返回 [None]
42+
- 如果 $start > end$,返回 `[None]`
1743
- 初始化存放所有可能二叉搜索树的数组。
18-
- 遍历 `[left, ..., right]` 的每一个节点 `i`,将其作为根节点。
44+
- 遍历 $[left, ..., right]$ 的每一个节点 $i$,将其作为根节点。
1945
- 递归构建左右子树。
2046
- 将所有符合要求的左右子树组合起来,将其加入到存放二叉搜索树的数组中。
2147
- 返回存放二叉搜索树的数组。
2248

23-
## 代码
49+
### 思路 1:代码
2450

2551
```python
2652
class Solution:
@@ -45,3 +71,8 @@ class Solution:
4571
return generateTrees(1, n)
4672
```
4773

74+
### 思路 1:复杂度分析
75+
76+
- **时间复杂度**:$O(C_n)$,其中 $C_n$ 是第 $n$ 个卡特兰数。
77+
- **空间复杂度**:$O(C_n)$,其中 $C_n$ 是第 $n$ 个卡特兰数。
78+

Solutions/0118. 杨辉三角.md

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

66
## 题目大意
77

8-
**描述**:给定一个整数 `numRows`
8+
**描述**:给定一个整数 $numRows$
99

10-
**要求**:生成前 `numRows` 行的杨辉三角。
10+
**要求**:生成前 $numRows$ 行的杨辉三角。
1111

1212
**说明**
1313

@@ -30,6 +30,13 @@
3030
]
3131
```
3232

33+
- 示例 2:
34+
35+
```python
36+
输入: numRows = 1
37+
输出: [[1]]
38+
```
39+
3340
## 解题思路
3441

3542
### 思路 1:动态规划
@@ -40,16 +47,16 @@
4047

4148
###### 2. 定义状态
4249

43-
定义状态 `dp[i][j]` 为:杨辉三角第 `i` 行、第 `j` 列位置上的值。
50+
定义状态 $dp[i][j]$ 为:杨辉三角第 $i$ 行、第 $j$ 列位置上的值。
4451

4552
###### 3. 状态转移方程
4653

47-
根据观察,很容易得出状态转移方程为:`dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]`,此时 `i > 0j > 0`
54+
根据观察,很容易得出状态转移方程为:$dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]$,此时 $i > 0$,$j > 0$
4855

4956
###### 4. 初始条件
5057

51-
- 每一行第一列都为 `1`,即 `dp[i][0] = 1`
52-
- 每一行最后一列都为 `1`,即 `dp[i][i] = 1`
58+
- 每一行第一列都为 $1$,即 $dp[i][0] = 1$
59+
- 每一行最后一列都为 $1$,即 $dp[i][i] = 1$
5360

5461
###### 5. 最终结果
5562

@@ -83,15 +90,15 @@ class Solution:
8390

8491
### 思路 2:动态规划 + 滚动数组优化
8592

86-
因为 `dp[i][j]` 仅依赖于上一行(第 `i - 1` 行)的 `dp[i - 1][j - 1]``dp[i - 1][j]`,所以我们没必要保存所有阶段的状态,只需要保存上一阶段的所有状态和当前阶段的所有状态就可以了,这样使用两个一维数组分别保存相邻两个阶段的所有状态就可以实现了。
93+
因为 $dp[i][j]$ 仅依赖于上一行(第 $i - 1$ 行)的 $dp[i - 1][j - 1]$$dp[i - 1][j]$,所以我们没必要保存所有阶段的状态,只需要保存上一阶段的所有状态和当前阶段的所有状态就可以了,这样使用两个一维数组分别保存相邻两个阶段的所有状态就可以实现了。
8794

8895
其实我们还可以进一步进行优化,即我们只需要使用一个一维数组保存上一阶段的所有状态。
8996

90-
定义 `dp[j]` 为杨辉三角第 `i` 行第 `j` 列位置上的值。则第 `i + 1` 行、第 `j` 列的值可以通过 `dp[j]` + `dp[j - 1]` 所得到。
97+
定义 $dp[j]$ 为杨辉三角第 $i$ 行第 $j$ 列位置上的值。则第 $i + 1$ 行、第 $j$ 列的值可以通过 $dp[j]$ + $dp[j - 1]$ 所得到。
9198

9299
这样我们就可以对这个一维数组保存的「上一阶段的所有状态值」进行逐一计算,从而获取「当前阶段的所有状态值」。
93100

94-
需要注意:本题在计算的时候需要从右向左依次遍历每个元素位置,这是因为如果从左向右遍历,如果当前元素 `dp[j]` 已经更新为当前阶段第 `j` 列位置的状态值之后,右侧 `dp[j + 1]` 想要更新的话,需要的是上一阶段的状态值 `dp[j]`,而此时 `dp[j]` 已经更新了,会破坏当前阶段的状态值。而如果用从右向左的顺序,则不会出现该问题。
101+
需要注意:本题在计算的时候需要从右向左依次遍历每个元素位置,这是因为如果从左向右遍历,如果当前元素 $dp[j]$ 已经更新为当前阶段第 $j$ 列位置的状态值之后,右侧 $dp[j + 1]$ 想要更新的话,需要的是上一阶段的状态值 $dp[j]$,而此时 $dp[j]$ 已经更新了,会破坏当前阶段的状态值。而如果用从右向左的顺序,则不会出现该问题。
95102

96103
### 思路 2:动态规划 + 滚动数组优化代码
97104

Solutions/0119. 杨辉三角 II.md

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

66
## 题目大意
77

8-
**描述**:给定一个非负整数 `rowIndex`
8+
**描述**:给定一个非负整数 $rowIndex$
99

10-
**要求**:返回杨辉三角的第 `rowIndex` 行。
10+
**要求**:返回杨辉三角的第 $rowIndex$ 行。
1111

1212
**说明**
1313

@@ -27,28 +27,28 @@
2727

2828
### 思路 1:动态规划
2929

30-
因为这道题是从 `0` 行开始计算,则可以先将 `rowIndex``1`,计算出总共的行数,即 `numRows = rowIndex + 1`
30+
因为这道题是从 $0$ 行开始计算,则可以先将 $rowIndex$$1$,计算出总共的行数,即 $numRows = rowIndex + 1$
3131

3232
###### 1. 划分阶段
3333

3434
按照行数进行阶段划分。
3535

3636
###### 2. 定义状态
3737

38-
定义状态 `dp[i][j]` 为:杨辉三角第 `i` 行、第 `j` 列位置上的值。
38+
定义状态 $dp[i][j]$ 为:杨辉三角第 $i$ 行、第 $j$ 列位置上的值。
3939

4040
###### 3. 状态转移方程
4141

42-
根据观察,很容易得出状态转移方程为:`dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]`,此时 `i > 0j > 0`
42+
根据观察,很容易得出状态转移方程为:$dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]$,此时 $i > 0$,$j > 0$
4343

4444
###### 4. 初始条件
4545

46-
- 每一行第一列都为 `1`,即 `dp[i][0] = 1`
47-
- 每一行最后一列都为 `1`,即 `dp[i][i] = 1`
46+
- 每一行第一列都为 $1$,即 $dp[i][0] = 1$
47+
- 每一行最后一列都为 $1$,即 $dp[i][i] = 1$
4848

4949
###### 5. 最终结果
5050

51-
根据题意和状态定义,将 `dp` 最后一行返回。
51+
根据题意和状态定义,将 $dp$ 最后一行返回。
5252

5353
### 思路 1:代码
5454

@@ -79,15 +79,15 @@ class Solution:
7979

8080
### 思路 2:动态规划 + 滚动数组优化
8181

82-
因为 `dp[i][j]` 仅依赖于上一行(第 `i - 1` 行)的 `dp[i - 1][j - 1]``dp[i - 1][j]`,所以我们没必要保存所有阶段的状态,只需要保存上一阶段的所有状态和当前阶段的所有状态就可以了,这样使用两个一维数组分别保存相邻两个阶段的所有状态就可以实现了。
82+
因为 $dp[i][j]$ 仅依赖于上一行(第 $i - 1$ 行)的 $dp[i - 1][j - 1]$$dp[i - 1][j]$,所以我们没必要保存所有阶段的状态,只需要保存上一阶段的所有状态和当前阶段的所有状态就可以了,这样使用两个一维数组分别保存相邻两个阶段的所有状态就可以实现了。
8383

8484
其实我们还可以进一步进行优化,即我们只需要使用一个一维数组保存上一阶段的所有状态。
8585

86-
定义 `dp[j]` 为杨辉三角第 `i` 行第 `j` 列位置上的值。则第 `i + 1` 行、第 `j` 列的值可以通过 `dp[j]` + `dp[j - 1]` 所得到。
86+
定义 $dp[j]$ 为杨辉三角第 $i$ 行第 $j$ 列位置上的值。则第 $i + 1$ 行、第 $j$ 列的值可以通过 $dp[j]$ + $dp[j - 1]$ 所得到。
8787

8888
这样我们就可以对这个一维数组保存的「上一阶段的所有状态值」进行逐一计算,从而获取「当前阶段的所有状态值」。
8989

90-
需要注意:本题在计算的时候需要从右向左依次遍历每个元素位置,这是因为如果从左向右遍历,如果当前元素 `dp[j]` 已经更新为当前阶段第 `j` 列位置的状态值之后,右侧 `dp[j + 1]` 想要更新的话,需要的是上一阶段的状态值 `dp[j]`,而此时 `dp[j]` 已经更新了,会破坏当前阶段的状态值。而是用从左向左的顺序,则不会出现该问题。
90+
需要注意:本题在计算的时候需要从右向左依次遍历每个元素位置,这是因为如果从左向右遍历,如果当前元素 $dp[j]$ 已经更新为当前阶段第 $j$ 列位置的状态值之后,右侧 $dp[j + 1]$ 想要更新的话,需要的是上一阶段的状态值 $dp[j]$,而此时 $dp[j]$ 已经更新了,会破坏当前阶段的状态值。而是用从左向左的顺序,则不会出现该问题。
9191

9292
### 思路 2:动态规划 + 滚动数组优化代码
9393

Solutions/0120. 三角形最小路径和.md

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

66
## 题目大意
77

8-
**描述**:给定一个代表三角形的二维数组 `triangle``triangle` 共有 `n` 行,其中第 `i` 行(从 `0` 开始编号)包含了 `i + 1` 个数。
8+
**描述**:给定一个代表三角形的二维数组 $triangle$,$triangle$ 共有 $n$ 行,其中第 $i$ 行(从 $0$ 开始编号)包含了 $i + 1$ 个数。
99

10-
我们每一步只能从当前位置移动到下一行中相邻的节点上。也就是说,如果正位于第 `i` 行第 `j` 列的节点,那么下一步可以移动到第 `i + 1` 行第 `j` 列的位置上,或者第 `i + 1` 行,第 `j + 1` 列的位置上。
10+
我们每一步只能从当前位置移动到下一行中相邻的节点上。也就是说,如果正位于第 $i$ 行第 $j$ 列的节点,那么下一步可以移动到第 $i + 1$ 行第 $j$ 列的位置上,或者第 $i + 1$ 行,第 $j + 1$ 列的位置上。
1111

1212
**要求**:找出自顶向下的最小路径和。
1313

@@ -33,6 +33,13 @@
3333
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
3434
```
3535

36+
- 示例 2:
37+
38+
```python
39+
输入:triangle = [[-10]]
40+
输出:-10
41+
```
42+
3643
## 解题思路
3744

3845
### 思路 1:动态规划
@@ -43,21 +50,21 @@
4350

4451
###### 2. 定义状态
4552

46-
定义状态 `dp[i][j]` 表示为:从顶部走到第 `i` 行(从 `0` 开始编号)、第 `j` 列的位置时的最小路径和。
53+
定义状态 $dp[i][j]$ 表示为:从顶部走到第 $i$ 行(从 $0$ 开始编号)、第 $j$ 列的位置时的最小路径和。
4754

4855
###### 3. 状态转移方程
4956

50-
由于每一步只能从当前位置移动到下一行中相邻的节点上,想要移动到第 `i` 行、第 `j` 列的位置,那么上一步只能在第 `i - 1` 行、第 `j - 1` 列的位置上,或者在第 `i - 1` 行、第 `j` 列的位置上。则状态转移方程为:
57+
由于每一步只能从当前位置移动到下一行中相邻的节点上,想要移动到第 $i$ 行、第 $j$ 列的位置,那么上一步只能在第 $i - 1$ 行、第 $j - 1$ 列的位置上,或者在第 $i - 1$ 行、第 $j$ 列的位置上。则状态转移方程为:
5158

52-
`dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j]`。其中 `triangle[i][j]` 表示第 `i` 行、第 `j` 列位置上的元素值。
59+
$dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j]$。其中 $triangle[i][j]$ 表示第 $i$ 行、第 $j$ 列位置上的元素值。
5360

5461
###### 4. 初始条件
5562

56-
在第 `0` 行、第 `j` 列时,最小路径和为 `triangle[0][0]`,即 `dp[0][0] = triangle[0][0]`
63+
在第 $0$ 行、第 $j$ 列时,最小路径和为 $triangle[0][0]$,即 $dp[0][0] = triangle[0][0]$
5764

5865
###### 5. 最终结果
5966

60-
根据我们之前定义的状态,`dp[i][j]` 表示为:从顶部走到第 `i` 行(从 `0` 开始编号)、第 `j` 列的位置时的最小路径和。为了计算出最小路径和,则需要再遍历一遍 `dp[size - 1]` 行的每一列,求出最小值即为最终结果。
67+
根据我们之前定义的状态,$dp[i][j]$ 表示为:从顶部走到第 $i$ 行(从 $0$ 开始编号)、第 $j$ 列的位置时的最小路径和。为了计算出最小路径和,则需要再遍历一遍 $dp[size - 1]$ 行的每一列,求出最小值即为最终结果。
6168

6269
### 思路 1:动态规划代码
6370

Solutions/0241. 为运算表达式设计优先级.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,5 +79,5 @@ class Solution:
7979

8080
### 思路 1:复杂度分析
8181

82-
- **时间复杂度**:$O(C_n)$,其中 $n$ 为结果数组的大小,$C_n$ 是第 $k$ 个卡特兰数。
82+
- **时间复杂度**:$O(C_n)$,其中 $n$ 为结果数组的大小,$C_n$ 是第 $n$ 个卡特兰数。
8383
- **空间复杂度**:$O(C_n)$。

Solutions/0354. 俄罗斯套娃信封问题.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
## 题目大意
77

8-
给定一个二维整数数组 envelopes 表示信封,其中 `envelopes[i] = [wi, hi]`,表示第 i 个信封的宽度 wi 和高度 hi
8+
给定一个二维整数数组 envelopes 表示信封,其中 $envelopes[i] = [wi, hi]$,表示第 $i$ 个信封的宽度 $w_i$ 和高度 $h_i$
99

1010
当一个信封的宽度和高度比另一个信封大时,则小的信封可以放进大信封里,就像俄罗斯套娃一样。
1111

0 commit comments

Comments
 (0)