mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-06 23:28:29 +08:00
@ -130,8 +130,8 @@ public:
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
* 时间复杂度:$O(n)$
|
* 时间复杂度:O(n)
|
||||||
* 空间复杂度:$O(n)$
|
* 空间复杂度:O(n)
|
||||||
|
|
||||||
当然依然也可以,优化一下空间复杂度,代码如下:
|
当然依然也可以,优化一下空间复杂度,代码如下:
|
||||||
|
|
||||||
@ -154,8 +154,8 @@ public:
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
* 时间复杂度:$O(n)$
|
* 时间复杂度:O(n)
|
||||||
* 空间复杂度:$O(1)$
|
* 空间复杂度:O(1)
|
||||||
|
|
||||||
后面将讲解的很多动规的题目其实都是当前状态依赖前两个,或者前三个状态,都可以做空间上的优化,**但我个人认为面试中能写出版本一就够了哈,清晰明了,如果面试官要求进一步优化空间的话,我们再去优化**。
|
后面将讲解的很多动规的题目其实都是当前状态依赖前两个,或者前三个状态,都可以做空间上的优化,**但我个人认为面试中能写出版本一就够了哈,清晰明了,如果面试官要求进一步优化空间的话,我们再去优化**。
|
||||||
|
|
||||||
@ -524,3 +524,4 @@ impl Solution {
|
|||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
@ -546,7 +546,7 @@ object Solution {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
## C
|
### C
|
||||||
|
|
||||||
```c
|
```c
|
||||||
int change(int amount, int* coins, int coinsSize) {
|
int change(int amount, int* coins, int coinsSize) {
|
||||||
@ -593,37 +593,3 @@ public class Solution
|
|||||||
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
<a href="https://programmercarl.com/other/kstar.html" target="_blank">
|
||||||
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
<img src="../pics/网站星球宣传海报.jpg" width="1000"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
----------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
回归本题,动规五步曲来分析如下:
|
|
||||||
|
|
||||||
1. 确定dp数组以及下标的含义
|
|
||||||
|
|
||||||
dp[j]:凑成总金额j的货币组合数为dp[j]
|
|
||||||
|
|
||||||
2. 确定递推公式
|
|
||||||
|
|
||||||
dp[j] 就是所有的dp[j - coins[i]](考虑coins[i]的情况)相加。
|
|
||||||
|
|
||||||
所以递推公式:dp[j] += dp[j - coins[i]];
|
|
||||||
|
|
||||||
**这个递推公式大家应该不陌生了,我在讲解01背包题目的时候在这篇[494. 目标和](https://programmercarl.com/0494.目标和.html)中就讲解了,求装满背包有几种方法,公式都是:dp[j] += dp[j - nums[i]];**
|
|
||||||
|
|
||||||
3. dp数组如何初始化
|
|
||||||
|
|
||||||
首先dp[0]一定要为1,dp[0] = 1是 递归公式的基础。如果dp[0] = 0 的话,后面所有推导出来的值都是0了。
|
|
||||||
|
|
||||||
那么 dp[0] = 1 有没有含义,其实既可以说 凑成总金额0的货币组合数为1,也可以说 凑成总金额0的货币组合数为0,好像都没有毛病。
|
|
||||||
|
|
||||||
但题目描述中,也没明确说 amount = 0 的情况,结果应该是多少。
|
|
||||||
|
|
||||||
这里我认为题目描述还是要说明一下,因为后台测试数据是默认,amount = 0 的情况,组合数为1的。
|
|
||||||
|
|
||||||
下标非0的dp[j]初始化为0,这样累计加dp[j - coins[i]]的时候才不会影响真正的dp[j]
|
|
||||||
|
|
||||||
dp[0]=1还说明了一种情况:如果正好选了coins[i]后,也就是j-coins[i] == 0的情况表示这个硬币刚好能选,此时dp[0]为1表示只选coins[i]存在这样的一种选法。
|
|
||||||
|
|
||||||
----------------
|
|
||||||
|
Reference in New Issue
Block a user