LeetCode

LeetCode 322. 零钱兑换

2020-03-08  本文已影响0人  桐桑入梦

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

示例 1:
输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1

示例 2:
输入: coins = [2], amount = 3
输出: -1

说明:
你可以认为每种硬币的数量是无限的。

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[][] sum = new int[ coins.length + 1 ][ amount + 1 ];

        for( int i = 1; i <= amount; i++ )
            sum[0][i] = Integer.MAX_VALUE;

        for( int i = 1; i <= coins.length; i++ ){
            for( int j = 1; j <= amount; j++ ){
                sum[i][j] = sum[ i - 1 ][j];
                //这里的if中的第二个判断条件重要,因为可能会出现溢出导致出现最小值
                if( j >= coins[ i - 1 ] && sum[i][ j - coins[ i - 1 ]] != Integer.MAX_VALUE ){
                    sum[i][j] = Math.min( sum[i][j], sum[i][ j - coins[ i - 1 ] ] + 1);
                }
                    
            }
        }
        int res = sum[ coins.length ][ amount ];
        return  res == Integer.MAX_VALUE ? -1 : res;
    }
}

重新写了一下:

class Solution {
    public int coinChange(int[] coins, int amount) {
        int[] sum = new int[ amount + 1 ]; // sum[0]初始化为0

        for( int i = 1; i <= amount; i++ )
            sum[i] = Integer.MAX_VALUE;

        for( int i = 0; i < coins.length; i++ ){
            for( int j = 1; j <= amount; j++ ){
                if( j >= coins[i] && sum[ j - coins[i] ] != Integer.MAX_VALUE )
                    sum[j] = Math.min( sum[j], sum[ j - coins[i] ] + 1);
            }
        }
        return sum[ amount ] == Integer.MAX_VALUE ? -1 : sum[ amount ];
    }
}
运行结果出乎意料的差

leetcode精选题解:使用递归和贪心等方法

上一篇下一篇

猜你喜欢

热点阅读