leetcode322.找零钱

妖狐艹你老母 2022-09-03 07:21 297阅读 0赞

请添加图片描述
经典动态规划,迭代法会超时,直接分析动态规划的几个重点
1、状态:dp数组要存什么

  • 对于本题,每个问题可以分解成相同的子问题,具体一点举例,求amout的最小硬币数,转化为求amount-1的最小硬币数等等。。dp数组存的就是amount

2、状态转移方程

  • 具体来看,假设我们有【1,2,5】三种硬币,需要求amount=100的最小硬币数,按照分解的思路,我们要求 max(amount-1最小硬币数+1,amount-2最小硬币数+1,amount-5最小硬币数+1)所以状态转化方程便是
    dp[i] = Math.min(dp[i - coin] + 1, dp[i - coin] + 1, ...)
    然后可以把coin数组用一个for循环代替变成

    for (let j = 0; j < coins.length; j++)

    1. { dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
    2. }

完整代码

  1. * @param { number} amount
  2. * @return { number}
  3. */
  4. var coinChange = function(coins, amount) {
  5. if(amount === 0) return 0;
  6. //初始化长度为amount+1,值为无穷大的数组
  7. let dp = Array(amount+1).fill(Infinity)
  8. dp[0] = 0;
  9. for(let i = 0; i < dp.length; i++) {
  10. for (let j = 0; j < coins.length; j++) {
  11. // 如果差值小于零
  12. if (i - coins[j] < 0) continue;
  13. // 每一个金额最低需要几个硬币
  14. dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
  15. }
  16. }
  17. console.log(dp)
  18. if(dp[amount] === Infinity) return -1;
  19. else return dp[amount]
  20. };

时间复杂度Omn
空间复杂度On

发表评论

表情:
评论列表 (有 0 条评论,297人围观)

还没有评论,来说两句吧...

相关阅读

    相关 leetcode 322 零钱兑换

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

    相关 leetcode322 零钱兑换

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

    相关 Leetcode 322. 零钱兑换

    题目重述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何

    相关 LeetCode-322. 零钱兑换

    [322. 零钱兑换][322.] 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币