zoukankan      html  css  js  c++  java
  • 零钱兑换

    此博客链接:https://www.cnblogs.com/ping2yingshi/p/13760948.html

    零钱兑换

    题目链接:https://leetcode-cn.com/problems/coin-change/submissions/

    给定不同面额的硬币 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 <= 231 - 1

    题解:

           思路:

                   1.如果钱的面值比零钱的最小值还小,这是不能兑换零钱的。

                   2.如果当前的钱数大于等于最大的零钱,当前的值减去最大的零钱数,记录兑换零钱数为1,比较剩下的钱,看是否比最大的零钱大,如果比最大的零钱大,剩下的前减去最大零钱数,兑换零钱数加1,直到剩下的钱小于最大的零钱数,剩下的零钱数和第二个大的零钱数做比较,直到剩下0元钱,记录一共兑换多少次零钱。

                  注意,上面忘记考虑,手里还剩钱,但是不能由零钱兑换了,这说明不能兑换零钱,应该返回-1.

     修改程序,发现又忘记一种情况,是当前零钱是0,意思是不需要兑换零钱,所以应该返回0.

    坑点,给的兑换零钱不一定是按从小到大的顺序排列的,需要自己先对数组排序。

    再次运行程序,又发现新的错误,这次发现上面思路都是错的,上面尽可能选择最大的,但是把最大的选完后,会出现两种情况,

    1.小的数可能零钱不够兑换,返回结果就是-1,

    coins:[ 4, 5]
    amount:28
    若按照我之前的贪心来计算,结果应该是28 = 5 + 5 + 5 + 5 + 5 + 3
    返回-1,然而正确的是28=5+5+5+5+4+4

    2.可以不需要最小的零钱兑换

    coins:[1, 4, 5]
    amount:28
    若按照计算,结果应该是28 = 5 + 5 + 5 + 5 + 5 + 1 + 1 + 1,8枚
    然而实际的最小数应该是28 = 5 + 5 + 5 + 5 + 4 + 4,6枚

    所以上面按照最大的取法是错误的。

  • 相关阅读:
    Dojo(发音:豆粥)的目标是解决DHTML应用程序长期存在的历史问题
    如何用Fireworks制作图标的透明效果
    2021.09.15膜你赛
    2021.09.14 膜你赛
    2021.08.29 膜你赛
    2021.08.28 膜你赛
    2021.10.06 膜你赛
    2021.09.18 膜你赛
    2021.09.13膜你赛
    2021.10.05膜你赛
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/13760948.html
Copyright © 2011-2022 走看看