返回介绍

lcof2 / 剑指 Offer II 103. 最少的硬币数目 / README

发布于 2024-06-17 01:04:41 字数 4758 浏览 0 评论 0 收藏 0

剑指 Offer II 103. 最少的硬币数目

题目描述

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

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

 

示例 1:

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

示例 2:

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

示例 3:

输入:coins = [1], amount = 0
输出:0

示例 4:

输入:coins = [1], amount = 1
输出:1

示例 5:

输入:coins = [1], amount = 2
输出:2

 

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 231 - 1
  • 0 <= amount <= 104

 

注意:本题与主站 322 题相同: https://leetcode.cn/problems/coin-change/

解法

方法一

class Solution:
  def coinChange(self, coins: List[int], amount: int) -> int:
    dp = [amount + 1] * (amount + 1)
    dp[0] = 0
    for coin in coins:
      for j in range(coin, amount + 1):
        dp[j] = min(dp[j], dp[j - coin] + 1)
    return -1 if dp[-1] > amount else dp[-1]
class Solution {

  public int coinChange(int[] coins, int amount) {
    int m = coins.length;
    int[][] dp = new int[m + 1][amount + 1];
    for (int i = 0; i <= m; ++i) {
      Arrays.fill(dp[i], amount + 1);
    }
    dp[0][0] = 0;
    for (int i = 1; i <= m; ++i) {
      int v = coins[i - 1];
      for (int j = 0; j <= amount; ++j) {
        for (int k = 0; k * v <= j; ++k) {
          dp[i][j] = Math.min(dp[i][j], dp[i - 1][j - k * v] + k);
        }
      }
    }
    return dp[m][amount] > amount ? -1 : dp[m][amount];
  }
}
class Solution {
public:
  int coinChange(vector<int>& coins, int amount) {
    vector<int> dp(amount + 1, amount + 1);
    dp[0] = 0;
    for (auto& coin : coins)
      for (int j = coin; j <= amount; ++j)
        dp[j] = min(dp[j], dp[j - coin] + 1);
    return dp[amount] > amount ? -1 : dp[amount];
  }
};
func coinChange(coins []int, amount int) int {
  dp := make([]int, amount+1)
  for i := 1; i <= amount; i++ {
    dp[i] = amount + 1
  }
  for _, coin := range coins {
    for j := coin; j <= amount; j++ {
      dp[j] = min(dp[j], dp[j-coin]+1)
    }
  }
  if dp[amount] > amount {
    return -1
  }
  return dp[amount]
}
/**
 * @param {number[]} coins
 * @param {number} amount
 * @return {number}
 */
var coinChange = function (coins, amount) {
  let dp = Array(amount + 1).fill(amount + 1);
  dp[0] = 0;
  for (const coin of coins) {
    for (let j = coin; j <= amount; ++j) {
      dp[j] = Math.min(dp[j], dp[j - coin] + 1);
    }
  }
  return dp[amount] > amount ? -1 : dp[amount];
};

方法二

class Solution {

  public int coinChange(int[] coins, int amount) {
    int m = coins.length;
    int[][] dp = new int[m + 1][amount + 1];
    for (int i = 0; i <= m; ++i) {
      Arrays.fill(dp[i], amount + 1);
    }
    dp[0][0] = 0;
    for (int i = 1; i <= m; ++i) {
      int v = coins[i - 1];
      for (int j = 0; j <= amount; ++j) {
        dp[i][j] = dp[i - 1][j];
        if (j >= v) {
          dp[i][j] = Math.min(dp[i][j], dp[i][j - v] + 1);
        }
      }
    }
    return dp[m][amount] > amount ? -1 : dp[m][amount];
  }
}

方法三

class Solution {

  public int coinChange(int[] coins, int amount) {
    int[] dp = new int[amount + 1];
    Arrays.fill(dp, amount + 1);
    dp[0] = 0;
    for (int coin : coins) {
      for (int j = coin; j <= amount; j++) {
        dp[j] = Math.min(dp[j], dp[j - coin] + 1);
      }
    }
    return dp[amount] > amount ? -1 : dp[amount];
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文