322. 零钱兑换
动态规划
java
class Solution {
public int coinChange(int[] coins, int amount) {
Arrays.sort(coins);
//子问题:在前i个硬币中选择最少的个数满足amount
//dp[amount] = Math.min(dp[amount],dp[amount-coins[i]])+1
//自下而上
int[] dp = new int[amount+1];
//因为就算是金额为1,也凑不出amount+1
Arrays.fill(dp,amount+1);
//定初始值
dp[0] = 0;
for(int i = 0;i<coins.length;i++){
int money = coins[i];
for(int sum = money;sum<=amount;sum++){
dp[sum] = Math.min(dp[sum],dp[sum-money]+1);
}
}
return dp[amount]>amount ? -1:dp[amount];
}
}
时间复杂度:O(N*S) N是coins数组长度,S是金额大小
空间复杂度:O(S)