每天一道算法題(二十一)

零錢兌換

給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

示例 1:

輸入: coins = [1, 2, 5], amount = 11
輸出: 3
解釋: 11 = 5 + 5 + 1

示例 2:

輸入: coins = [2], amount = 3
輸出: -1

說明:
你可以認爲每種硬幣的數量是無限的。

從1開始,找到每個金額最少的硬幣組合,進行累加至要求的總金額。

/**
 * @param {number[]} coins
 * @param {number} amount
 * @return {number}
 */

var coinChange = function(coins, amount) {
    if (amount === 0) {
      return 0;
    }
    const dp =new Array(amount + 1).fill(Number.MAX_VALUE) // 給每一個添加一個初始值,下標從0開始,到amount-1,所以要加1
    dp[0] = 0; // 重新賦值
    for (let i = 1; i < dp.length; i++) { // 一直循環到最後一個(要求的總金額)
      for (let j = 0; j < coins.length; j++) { // 遍歷硬幣金額大小
        if (i - coins[j] >= 0) { // 當前的總金額不小於硬幣金額大小
          dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1); 
        }
      }
    }
    return dp[dp.length - 1] === Number.MAX_VALUE ? -1 : dp[dp.length - 1];
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章