问题产生的原因是最近在leetcode刷题,零钱兑换2中产生的,思路一下子陷进了死胡同,放两段代码,上面的是错误的,下面是正确的。
public int change(int amount, int[] coins) {
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int coin : coins) {
for (int i = 1; i <= amount && i >= coin; i++) {
dp[i] += dp[i - coin];
}
}
return dp[amount];
}
public int change(int amount, int[] coins) {
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int coin : coins) {
for (int i = 1; i <= amount; i++) {
if (i >= coin) dp[i] += dp[i - coin];
}
}
return dp[amount];
}
看出啥问题了吧,我吧for里面的判断提到了for循环中间去判断了,只要失败了,这次for就等于结束了,其实也有办法可以把if条件往for中提。
public int change(int amount, int[] coins) {
int[] dp = new int[amount + 1];
dp[0] = 1;
for (int coin : coins) {
for (int i = coin; i <= amount; i++) {
dp[i] += dp[i - coin];
}
}
return dp[amount];
}
既然我们需要i大于等于coin才能执行里面的,那i初始值就直接等于coin就好了