最小硬币组合(leetcode322)


一:解题思路

这道题和leetcode518 比较类似。将状态稍微修改一下,d(i,j)表示使用前i种面值的硬币(即面值数组中0~i-1的元素),凑成数值j需要的最少硬币数量。

Time:O(n*sum),Space;O(n*sum),其中n为面值数组的长度。

二:完整代码示例 (C、C++、Java、Python)
方法一C++:

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<vector<int>> d(coins.size()+1,vector<int>(amount+1,0));

        for (int j = 0; j <= amount; j++)
            d[0][j] = INT_MAX;

        for (int i = 1; i <= coins.size(); i++) {
            for (int j = 1; j <= amount; j++) {
                int useCurCoin = j >= coins[i - 1] ? d[i][j - coins[i - 1]] : INT_MAX;
                if (useCurCoin != INT_MAX) useCurCoin += 1;
                d[i][j] = min(d[i - 1][j], useCurCoin);
            }
        }

        return d[coins.size()][amount]==INT_MAX?-1:d[coins.size()][amount];
    }
};

 

方法一Java:

class Solution {
      public int coinChange(int[] coins, int amount) {
          int[][] d=new int[coins.length+1][amount+1];
          for (int j=0;j<=amount;j++)
            d[0][j]=Integer.MAX_VALUE;

          for (int i=1;i<=coins.length;i++){
            for (int j=1;j<=amount;j++){
              int useCurCoin=j>=coins[i-1]?d[i][j-coins[i-1]]:Integer.MAX_VALUE;
              if (useCurCoin!=Integer.MAX_VALUE) useCurCoin+=1;
              d[i][j]=Math.min(d[i-1][j],useCurCoin);
            }
          }

          return d[coins.length][amount]==Integer.MAX_VALUE?-1:d[coins.length][amount];
      }
    }

 

方法一Python:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM