avatar

LeetCode-332-零钱兑换

【题目描述】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

示例 1:

输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:

输入: coins = [2], amount = 3
输出: -1
说明:
你可以认为每种硬币的数量是无限的。

# 来源:力扣(LeetCode)
# 链接:https://leetcode-cn.com/problems/coin-change
# 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

Java

<解法一> 动态规划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public int coinChange(int[] coins, int amount) { //输入硬币面值种类coins[];要凑成的钱数amount;
int []f=new int [amount+1]; //初始化一个数组f[],长度是amount+1;
int n=coins.length;
f[0]=0; //处理特殊值:f[0]=0 0元钱用0枚硬币拼出
for(int i=1;i<=amount;i++){ //计算f[1],f[2]....f[amount]
f[i]=Integer.MAX_VALUE;
//状态方程 f[amount]=min(f[i-coins[0]]+1...f[i-coins[n-1]]+1)
for(int j=0;j<n;j++){
if(i>=coins[j]&&f[i-coins[j]]!=Integer.MAX_VALUE){
f[i]=Math.min((f[i-coins[j]])+1,f[i]);
}
}
}
if((f[amount])==Integer.MAX_VALUE){
f[amount]=-1;
}
return f[amount];
}
}

不懂的话可以看看B站九章算术的视频:传送门


执行结果:通过

执行用时 :16 ms, 在所有 Java 提交中击败了59.86%的用户

内存消耗 :39.5 MB, 在所有 Java 提交中击败了5.06%的用户


复杂度分析

时间复杂度:O(amount*n)

空间复杂度:O(amount*n)

文章作者: yookbu
文章链接: http://www.yookbu.xyz/LeetCode-332-%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 yookbu
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论