classSolution{publicintcoinChange(int[] coins,int amount){if(amount ==0)return0;if(amount <0)return-1;int res =Integer.MAX_VALUE;for(int i =0; i < coins.length; i++){if(amount < coins[i])continue;int sub =coinChange(coins, amount - coins[i]);if(sub ==-1)continue;
res =Math.min(res,1+ sub);}return res ==Integer.MAX_VALUE?-1: res;}}
时间复杂度:O(3n)
空间复杂度:O(n)
解法二:备忘录,存中间结果
classSolution{privateint[] memo;publicintcoinChange(int[] coins,int amount){
memo =newint[amount+1];Arrays.fill(memo,-6);returndp(coins, amount);}privateintdp(int[] coins,int amount){if(amount ==0)return0;if(amount <0)return-1;if(memo[amount]!=-6)return memo[amount];int res =Integer.MAX_VALUE;for(int i =0; i < coins.length; i++){if(amount < coins[i])continue;int sub =dp(coins, amount - coins[i]);if(sub ==-1)continue;
res =Math.min(res,1+ sub);}
memo[amount]=(res ==Integer.MAX_VALUE)?-1: res;return memo[amount];}}
时间复杂度:O(n)
空间复杂度:O(n)
解法三:DP table自底向上
classSolution{publicintcoinChange(int[] coins,int amount){int[] dp =newint[amount+1];Arrays.fill(dp, amount+1);
dp[0]=0;int res =Integer.MAX_VALUE;for(int i =1; i <= amount; i++){for(int coin : coins){if(i < coin)continue;
dp[i]=Math.min(dp[i],1+dp[i-coin]);}}return dp[amount]== amount+1?-1: dp[amount];}}