322. 零钱兑换
分析
- 定义状态:
f[j]
:表示凑成金额j
所需的最少硬币个数
- 状态转移方程:
- 对于每个硬币面值
coins[i]
,如果选择该硬币,那么金额j
的状态可以由金额j - coins[i]
转移而来:f[j] = min(f[j], f[j - coins[i]] + 1)
,即当前金额的最优解为不选择当前硬币的解和选择当前硬币的解的较小值
- 对于每个硬币面值
- 初始化:
f[0] = 0
:凑成金额0
所需的硬币数为0
- 其他状态
f[j]
初始化为无穷大(设为一个较大的值INF
),表示尚未凑成
- 结果判断:
- 如果
f[amount] = INF
,表示无法凑成金额amount
,返回-1
- 否则返回
f[amount]
- 如果
时间复杂度
外层循环遍历硬币种类 O(n)
,内层循环遍历金额 O(amount)
,总复杂度为 O(n * amount)
空间复杂度
空间复杂度为 O(amount)
C++代码
|
|