我正在研究Leetcode 322 Coin Change上的这个问题。
问题是;您将获得不同面额和总金额的硬币,编写一个函数来计算您需要弥补该金额的最少数量的硬币。如果这笔钱不能由任何硬币组合弥补,则返回-1。
示例1
币= [1,2,5],金额= 11
返回3(11 = 5 + 5 + 1)
示例2
币= [2],金额= 3
返回-1
以下是JAVA DP Solution;
public int coinChange(int[] coins, int amount) {
if(amount==0) return 0;
int[] dp = new int[amount+1];
dp[0]=0; // do not need any coin to get 0 amount
for(int i=1;i<=amount; i++)
dp[i]= Integer.MAX_VALUE;
for(int i=0; i<=amount; i++){
for(int coin: coins){
if(i+coin <=amount){
if(dp[i]!=Integer.MAX_VALUE){
if(dp[i+coin] >= dp[i] + 1)
dp[i+coin] = dp[i] + 1;
}
}
}
}
if(dp[amount] >= Integer.MAX_VALUE)
return -1;
return dp[amount];
}
当我使用coins = [1,2147483646], amount = 2
运行测试用例时
我总是收到错误消息
java.lang.ArrayIndexOutOfBoundsException:-2147483648 for line
if(dp [i + coin]&gt; = dp [i] + 1)
我试图理解为什么会这样。我认为硬币值2147483646
不会通过此行if(i+coin <=amount)
来影响以下代码。正确?
解决了!通过改变if(i + coin&lt; = amount)to if(i + coin&lt; = amount&amp;&amp; i + coin&gt; = 0))