Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

[pull] main from itcharge:main #158

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
pull merged 2 commits into AlgorithmAndLeetCode:main from itcharge:main
Sep 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Contents/00.Introduction/02.Algorithm-Complexity.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ def algorithm(n):
return cnt
```

上述代码中 `cnt = 1` 的时间复杂度为 $O(1)$ 可以忽略不算。`while` 循环体中 $cnt$ 从 1ドル$ 开始,每循环一次都乘以 2ドル$。当大于等于 $n$ 时循环结束。变量 $cnt$ 的取值是一个等比数列:2ドル^0,2^1,2^2,...,2^x,ドル根据 2ドル^x = n,ドル可以得出这段循环体的执行次数为 $\log_2n,ドル所以这段代码的时间复杂度为 $O(\log_2n)$。
上述代码中 `cnt = 1` 的时间复杂度为 $O(1)$ 可以忽略不算。`while` 循环体中 $cnt$ 从 1ドル$ 开始,每循环一次都乘以 2ドル$。当大于等于 $n$ 时循环结束。变量 $cnt$ 的取值是一个等比数列:2ドル^0, 2^1, 2^2, ..., 2^x,ドル根据 2ドル^x = n,ドル可以得出这段循环体的执行次数为 $\log_2n,ドル所以这段代码的时间复杂度为 $O(\log_2n)$。

因为 $\log n = k \times \log_2 n,ドル这里 $k = 3.322,ドル所以,$\log n$ 与 $\log_2 n$ 的差别比较小。为了方便书写,通常我们将对数时间复杂度写作是 $O(\log n)$。

Expand Down
2 changes: 1 addition & 1 deletion Contents/07.Tree/01.Binary-Tree/01.Binary-Tree-Basic.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
- 包括根节点在内,每个节点可以有多个后继节点。
- 当 $n > 1$ 时,除了根节点之外的其他节点,可分为 $m(m > 0)$ 个互不相交的有限集合 $T_1, T_2, ..., T_m,ドル其中每一个集合本身又是一棵树,并且被称为根的 **「子树(SubTree)」**。

如下图所示,红色节点 $A$ 是根节点,除了根节点之外,还有 `3` 棵互不相交的子树 $T_1(B、E、H、I、G)$、$T_2(C)$、$T_3(D、F、G、K)$。
如下图所示,红色节点 $A$ 是根节点,除了根节点之外,还有 `3` 棵互不相交的子树 $T_1(B, E, H, I, G)$、$T_2(C)$、$T_3(D, F, G, K)$。

![](https://qcdn.itcharge.cn/images/20220218104556.png)

Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

### 1.1 树状数组的定义

> **树状数组(Binary Indexed Tree)**:也因其发明者命名为 Fenwick 树,最早由 Peter M. Fenwick 于 1994 年以 A New Data Structure for Cumulative Frequency Tables 为题发表在 SOFTWARE PRACTICE AND EXPERIENCE。其初衷是解决数据压缩里的累积频率(Cumulative Frequency)的计算问题,现多用于高效计算数列的前缀和,区间和。它可以以 $O(\log n)$ 的时间得到任意前缀 $\sum_{i=1}^{j}A[i], 1 \le j \le N,ドル并同时支持在 $O(\log n)$ 时间内支持动态单点值的修改。空间复杂度为 $O(n)$。
> **树状数组(Binary Indexed Tree)**:也因其发明者命名为 Fenwick 树,最早 Peter M. Fenwick 于 1994 年以 A New Data Structure for Cumulative Frequency Tables 为题发表在 SOFTWARE PRACTICE AND EXPERIENCE。其初衷是解决数据压缩里的累积频率(Cumulative Frequency)的计算问题,现多用于高效计算数列的前缀和,区间和。它可以以 $O(\log n)$ 的时间得到任意前缀 $\sum_{i=1}^{j}A[i], 1 \le j \le n,ドル并同时支持在 $O(\log n)$ 时间内支持动态单点值的修改。空间复杂度为 $O(n)$。

### 1.2 树状数组的原理

Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@

则状态转移方程为:

$dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \rbrace,\quad 0 \le k \times weight[i - 1] \le w$。
$dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \rbrace, \quad 0 \le k \times weight[i - 1] \le w$。

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。
- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0, 0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0, 0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -81,15 +81,15 @@ class Solution:

我们将之前的状态转移方程

$dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \rbrace,\quad 0 \le k \times weight[i - 1] \le w$
$dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \rbrace, \quad 0 \le k \times weight[i - 1] \le w$

进行展开:

$(1) \quad dp[i][w] = max \begin{cases} dp[i - 1][w] \cr dp[i - 1][w - weight[i - 1]] + value[i - 1] \cr dp[i - 1][w - 2 \times weight[i - 1]] + 2 \times value[i - 1] \cr ...... \cr \cr dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \end{cases},\quad 0 \le k \times weight[i - 1] \le w$
$(1) \quad dp[i][w] = max \begin{cases} dp[i - 1][w] \cr dp[i - 1][w - weight[i - 1]] + value[i - 1] \cr dp[i - 1][w - 2 \times weight[i - 1]] + 2 \times value[i - 1] \cr ...... \cr \cr dp[i - 1][w - k \times weight[i - 1]] + k \times value[i - 1] \end{cases}, \quad 0 \le k \times weight[i - 1] \le w$

而对于 $dp[i][w - weight[i - 1]]$ 我们有:

$(2) \quad dp[i][w - weight[i - 1]] = max \begin{cases} dp[i - 1][w - weight[i - 1]] \cr dp[i - 1][w - 2 \times weight[i - 1]] + value[i - 1] \cr dp[i - 1][w - 3 \times weight[i - 1]] + 2 \times value[i - 1] \cr ...... \cr dp[i - 1][w - k \times weight[i - 1]] + (k - 1) \times value[i - 1] \end{cases},\quad weight[i - 1] \le k \times weight[i - 1] \le w$
$(2) \quad dp[i][w - weight[i - 1]] = max \begin{cases} dp[i - 1][w - weight[i - 1]] \cr dp[i - 1][w - 2 \times weight[i - 1]] + value[i - 1] \cr dp[i - 1][w - 3 \times weight[i - 1]] + 2 \times value[i - 1] \cr ...... \cr dp[i - 1][w - k \times weight[i - 1]] + (k - 1) \times value[i - 1] \end{cases}, \quad weight[i - 1] \le k \times weight[i - 1] \le w$

通过观察可以发现:

Expand Down Expand Up @@ -133,8 +133,8 @@ $\quad dp[i][w] = \begin{cases} dp[i - 1][w] & w < weight[i - 1] \cr max \lbrac

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。
- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0, 0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0, 0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -201,7 +201,7 @@ $dp[w] = \begin{cases} dp[w] & w < weight[i - 1] \cr max \lbrace dp[w], \quad d

###### 4. 初始条件

- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0, 0 \le w \le W$。

###### 5. 最终结果

Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ $dp[i][w] = max \lbrace dp[i - 1][w - k \times weight[i - 1]] + k \times value[i

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。
- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0, 0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0, 0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -121,7 +121,7 @@ class Solution:

但我们还是可以从物品数量入手,通过「二进制优化」的方式,将算法的时间复杂度降低。

> **二进制优化**:简单来说,就是把物品的数量 $count[i]$ 拆分成「由 1ドル、2、4、...、2^m$ 件单个物品组成的大物品」,以及「剩余不足 2ドル$ 的整数次幂数量的物品,由 $count[i] -2^{\lfloor \log_2(count[i] + 1) \rfloor - 1}$ 件单个物品组成大物品」。
> **二进制优化**:简单来说,就是把物品的数量 $count[i]$ 拆分成「由 1ドル, 2, 4, ..., 2^m$ 件单个物品组成的大物品」,以及「剩余不足 2ドル$ 的整数次幂数量的物品,由 $count[i] -2^{\lfloor \log_2(count[i] + 1) \rfloor - 1}$ 件单个物品组成大物品」。

举个例子,第 $i$ 件物品的数量为 31ドル,ドル采用「二进制优化」的方式,可以拆分成 31ドル = 1 + 2 + 4 + 8 + 16$ 一共 5ドル$ 件物品。也将是将 31ドル$ 件物品分成了 5ドル$ 件大物品:

Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,12 @@ class Solution:

则状态转移方程为:

$dp[i][w] = max \lbrace dp[i - 1][w],dp[i - 1][w - weight[i - 1][k]] + value[i - 1][k] \rbrace , \quad 0 \le k \le group\underline{}count[i - 1]$
$dp[i][w] = max \lbrace dp[i - 1][w], dp[i - 1][w - weight[i - 1][k]] + value[i - 1][k] \rbrace , \quad 0 \le k \le group\underline{}count[i - 1]$

###### 4. 初始条件

- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0,0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 组物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0,0 \le w \le W$。
- 如果背包载重上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[i][0] = 0, 0 \le i \le size$。
- 无论背包载重上限是多少,前 0ドル$ 组物品所能获得的最大价值一定为 0ドル,ドル即 $dp[0][w] = 0, 0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -163,11 +163,11 @@ class Solution:

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

$dp[w] = max \lbrace dp[w], \quad dp[w - weight[i - 1][k]] + value[i - 1][k] \rbrace ,\quad 0 \le k \le group\underline{}count[i - 1]$
$dp[w] = max \lbrace dp[w], \quad dp[w - weight[i - 1][k]] + value[i - 1][k] \rbrace , \quad 0 \le k \le group\underline{}count[i - 1]$

###### 4. 初始条件

- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。
- 无论背包载重上限为多少,只要不选择物品,可以获得的最大价值一定是 0ドル,ドル即 $dp[w] = 0, 0 \le w \le W$。

###### 5. 最终结果

Expand Down Expand Up @@ -229,11 +229,11 @@ $dp[i][w][v] = max(dp[i - 1][w][v], dp[i - 1][w - weight[i - 1]][v - volume[i -
###### 4. 初始条件

- 如果背包载重上限为 0ドル$ 或者容量上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即:
- $dp[i][w][0] = 0,0 \le i \le size,0 \le w \le W$
- $dp[i][0][v] = 0,0 \le i \le size,0 \le v \le V$
- $dp[i][w][0] = 0, 0 \le i \le size, 0 \le w \le W$
- $dp[i][0][v] = 0, 0 \le i \le size, 0 \le v \le V$

- 无论背包载重上限是多少,前 0ドル$ 种物品所能获得的最大价值一定为 0ドル,ドル即:
- $dp[0][w][v] = 0,0 \le w \le W,0 \le v \le V$
- $dp[0][w][v] = 0, 0 \le w \le W, 0 \le v \le V$


###### 5. 最终结果
Expand Down Expand Up @@ -290,8 +290,8 @@ $dp[w][v] = max \lbrace dp[w][v], \quad dp[w - weight[i - 1]][v - volume[i - 1]]
###### 4. 初始条件

- 如果背包载重上限为 0ドル$ 或者容量上限为 0ドル,ドル则无论选取什么物品,可以获得的最大价值一定是 0ドル,ドル即:
- $dp[w][0] = 0,0 \le w \le W$
- $dp[0][v] = 0,0 \le v \le V$
- $dp[w][0] = 0, 0 \le w \le W$
- $dp[0][v] = 0, 0 \le v \le V$


###### 5. 最终结果
Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@

在背包问题中,有的题目不要求把背包装满,而有的题目要求恰好装满背包。

如果题目要求「恰好装满背包」,则我们可在原有状态定义、状态转移方程的基础上,在初始化时,令 $dp[0] = 0,ドル以及 $d[w] = -\infty,1 \le w \le W$。 这样就可以保证最终得到的 $dp[W]$ 为恰好装满背包的最大价值总和。
如果题目要求「恰好装满背包」,则我们可在原有状态定义、状态转移方程的基础上,在初始化时,令 $dp[0] = 0,ドル以及 $d[w] = -\infty, 1 \le w \le W$。 这样就可以保证最终得到的 $dp[W]$ 为恰好装满背包的最大价值总和。

这是因为:初始化的 $dp$ 数组实际上就是在没有任何物品可以放入背包时的「合法状态」。

如果不要求恰好装满背包,那么:

1. 任何载重上限下的背包,在不放入任何物品时,都有一个合法解,此时背包所含物品的最大价值为 0ドル,ドル即 $dp[w] = 0,0 \le w \le W$。
1. 任何载重上限下的背包,在不放入任何物品时,都有一个合法解,此时背包所含物品的最大价值为 0ドル,ドル即 $dp[w] = 0, 0 \le w \le W$。

而如果要求恰好装满背包,那么:

1. 只有载重上限为 0ドル$ 的背包,在不放入物品时,能够恰好装满背包(有合法解),此时背包所含物品的最大价值为 0ドル,ドル即 $dp[0] = 0$。
2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty,ドル即 $dp[w] = 0,0 \le w \le W$。
2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty,ドル即 $dp[w] = 0, 0 \le w \le W$。

这样在进行状态转移时,我们可以通过判断 $dp[w]$ 与 $-\infty$ 的关系,来判断是否能恰好装满背包。

Expand All @@ -32,7 +32,7 @@
3. **状态转移方程**:$dp[w] = dp[w] + dp[w - weight[i - 1]]$
4. **初始条件**:
1. 只有载重上限为 0ドル$ 的背包,在不放入物品时,能够恰好装满背包(有合法解),此时背包所含物品的最大价值为 0ドル,ドル即 $dp[0] = 0$。
2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty,ドル即 $dp[w] = 0,0 \le w \le W$。
2. 其他载重上限下的背包,在放入物品的时,都不能恰好装满背包(都没有合法解),此时背包所含物品的最大价值属于未定义状态,值应为 $-\infty,ドル即 $dp[w] = 0, 0 \le w \le W$。
5. **最终结果**:根据我们之前定义的状态, $dp[w]$ 表示为:将物品装入最多能装重量为 $w$ 的背包中的方案总数。则最终结果为 $dp[W],ドル其中 $W$ 为背包的载重上限。

#### 思路 1:代码
Expand Down Expand Up @@ -192,7 +192,7 @@ class Solution:

> **0-1 背包问题求具体方案**:有 $n$ 种物品和一个最多能装重量为 $W$ 的背包,第 $i$ 种物品的重量为 $weight[i],ドル价值为 $value[i],ドル每件物品有且只有 1ドル$ 件。请问将哪些物品装入背包,可使这些物品的总重量不超过背包载重上限,且价值总和最大?

#### 思路 4:动态规划 + 路径记录
#### 4:动态规划 + 路径记录

0-1 背包问题的状态转移方程为:$dp[i][w] = max \lbrace dp[i - 1][w], \quad dp[i - 1][w - weight[i - 1]] + value[i - 1] \rbrace$

Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ for i in range(size - 1, -1, -1): # 枚举区间起点

#### 1.2.3 第 2 种区间 DP 问题基本思路

多个(大于等于 2ドル$ 个)小区间转移到大区间的区间 DP 问题的状态转移方程一般为:$dp[i][j] = max / min \lbrace dp[i][k] + dp[k + 1][j] + cost[i][j] \rbrace,\quad i < k \le j$。
多个(大于等于 2ドル$ 个)小区间转移到大区间的区间 DP 问题的状态转移方程一般为:$dp[i][j] = max / min \lbrace dp[i][k] + dp[k + 1][j] + cost[i][j] \rbrace, \quad i < k \le j$。

1. 其中状态 $dp[i][j]$ 表示为:区间 $[i, j]$ (即下标位置 $i$ 到下标位置 $j$ 上所有元素)上的最大价值。
2. $cost[i][j]$ 表示为:将两个区间 $[i, k]$ 与 $[k + 1, j]$ 中的元素合并为区间 $[i, j]$ 中的元素的代价。
Expand Down Expand Up @@ -232,7 +232,7 @@ $dp[i][j] = max \lbrace dp[i][k] + dp[k][j] + nums[i] \times nums[k] \times nums

###### 4. 初始条件

- $dp[i][j]$ 表示的是开区间,则 $i < j - 1$。而当 $i \ge j - 1$ 时,所能获得的硬币数为 0ドル,ドル即 $dp[i][j] = 0,\quad i \ge j - 1$。
- $dp[i][j]$ 表示的是开区间,则 $i < j - 1$。而当 $i \ge j - 1$ 时,所能获得的硬币数为 0ドル,ドル即 $dp[i][j] = 0, \quad i \ge j - 1$。

###### 5. 最终结果

Expand Down
6 changes: 3 additions & 3 deletions Contents/10.Dynamic-Programming/07.State-DP/01.State-DP.md
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,8 @@

举个例子:

1. $nums2 = \lbrace 1, 2, 3, 4 \rbrace,state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。
2. $nums2 = \lbrace 1, 2, 3, 4, 5, 6 \rbrace,state = (011010)_2,ドル表示选择了第 2ドル$ 个元素、第 4ドル$ 个元素、第 5ドル$ 个元素,也就是 2ドル$、4ドル$、5ドル$。
1. $nums2 = \lbrace 1, 2, 3, 4 \rbrace, state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。
2. $nums2 = \lbrace 1, 2, 3, 4, 5, 6 \rbrace, state = (011010)_2,ドル表示选择了第 2ドル$ 个元素、第 4ドル$ 个元素、第 5ドル$ 个元素,也就是 2ドル$、4ドル$、5ドル$。

这样,我们就可以通过动态规划的方式来解决这道题。

Expand All @@ -173,7 +173,7 @@

对于当前状态 $dp[state],ドル肯定是从比 $state$ 少选一个元素的状态中递推而来。我们可以枚举少选一个元素的状态,找到可以组成的异或值之和最小值,赋值给 $dp[state]$。

举个例子 $nums2 = \lbrace 1, 2, 3, 4 \rbrace,state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。那么 $state$ 只能从 $(1000)_2$ 和 $(0001)_2$ 这两个状态转移而来,我们只需要枚举这两种状态,并求出转移过来的异或值之和最小值。
举个例子 $nums2 = \lbrace 1, 2, 3, 4 \rbrace,ドル$state = (1001)_2,ドル表示选择了第 1ドル$ 个元素和第 4ドル$ 个元素,也就是 1ドル$、4ドル$。那么 $state$ 只能从 $(1000)_2$ 和 $(0001)_2$ 这两个状态转移而来,我们只需要枚举这两种状态,并求出转移过来的异或值之和最小值。

即状态转移方程为:$dp[state] = min(dp[state], \quad dp[state \oplus (1 \text{ <}\text{< } i)] + (nums1[i] \oplus nums2[one\underline{}cnt - 1])),ドル其中 $state$ 第 $i$ 位一定为 1ドル,ドル$one\underline{}cnt$ 为 $state$ 中 1ドル$ 的个数。

Expand Down
View file Open in desktop
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@

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

因为我们每次只能向右、或者向下移动一步,因此想要走到 $(i, j),ドル只能从 $(i - 1, j)$ 向下走一步走过来;或者从 $(i, j - 1)$ 向右走一步走过来。所以可以写出状态转移方程为:$dp[i][j] = dp[i - 1][j] + dp[i][j - 1],ドル此时 $i > 0,j > 0$。
因为我们每次只能向右、或者向下移动一步,因此想要走到 $(i, j),ドル只能从 $(i - 1, j)$ 向下走一步走过来;或者从 $(i, j - 1)$ 向右走一步走过来。所以可以写出状态转移方程为:$dp[i][j] = dp[i - 1][j] + dp[i][j - 1],ドル此时 $i > 0, j > 0$。

###### 4. 初始条件

Expand Down Expand Up @@ -115,8 +115,8 @@ class Solution:

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

- **时间复杂度**:$O(m * n)$。初始条件赋值的时间复杂度为 $O(m + n),ドル两重循环遍历的时间复杂度为 $O(m * n),ドル所以总体时间复杂度为 $O(m * n)$。
- **空间复杂度**:$O(m * n)$。用到了二维数组保存状态,所以总体空间复杂度为 $O(m * n)$。因为 $dp[i][j]$ 的状态只依赖于上方值 $dp[i - 1][j]$ 和左侧值 $dp[i][j - 1],ドル而我们在进行遍历时的顺序刚好是从上至下、从左到右。所以我们可以使用长度为 $m$ 的一维数组来保存状态,从而将空间复杂度优化到 $O(m)$。
- **时间复杂度**:$O(m \times n)$。初始条件赋值的时间复杂度为 $O(m + n),ドル两重循环遍历的时间复杂度为 $O(m * n),ドル所以总体时间复杂度为 $O(m \times n)$。
- **空间复杂度**:$O(m \times n)$。用到了二维数组保存状态,所以总体空间复杂度为 $O(m \times n)$。因为 $dp[i][j]$ 的状态只依赖于上方值 $dp[i - 1][j]$ 和左侧值 $dp[i][j - 1],ドル而我们在进行遍历时的顺序刚好是从上至下、从左到右。所以我们可以使用长度为 $m$ 的一维数组来保存状态,从而将空间复杂度优化到 $O(m)$。

### 2.2 整数拆分

Expand Down
Loading

AltStyle によって変換されたページ (->オリジナル) /