题目
解题思路
dp[i] 表示,amount等于i时,至少要拿的硬币数
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
for (int i = 0; i < coins.length; i++) {
if (coins[i] <= amount) {
dp[coins[i]] = 1;
}
}
for(int i = 0; i <= amount; i++) {
if (dp[i] == 0) {
dp[i] = -1;
}
}
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
int min = Integer.MAX_VALUE;
for (int j = 0; j < coins.length; j++) {
if (i - coins[j] >= 0 && dp[i - coins[j]] < min && dp[i - coins[j]] != -1) {
min = dp[i - coins[j]];
}
}
if (min != Integer.MAX_VALUE && (dp[i] > min + 1 || dp[i] == -1)) {
dp[i] = min + 1;
}
}
return dp[amount];
}
}
优化
去掉不必要的判断和运算,max_value-1是防止后面的dp[i - coins[j]] + 1溢出。
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
dp[0] = 0;
int maxValue = Integer.MAX_VALUE - 1;
for (int i = 1; i <= amount; i++) {
dp[i] = maxValue;
for (int j = 0; j < coins.length; j++) {
if (i - coins[j] >= 0) {
dp[i] = Math.min(dp[i - coins[j]] + 1, dp[i]);
}
}
}
return dp[amount] == maxValue? -1: dp[amount];
}
}