LeetCode 2952 需要添加的硬币的最小数量(贪心)

本文介绍了一个关于硬币组合的问题,目标是从给定的硬币数组中,找到最少需要添加哪些面额的硬币,使得所有从1到某个特定目标值的整数都能被组合出来。文章通过贪心策略和逐步递增目标值的方法求解,确保返回的额外硬币数量最小。
摘要由CSDN通过智能技术生成

题目:

示例 1:

输入:coins = [1,4,10], target = 19
输出:2
解释:需要添加面值为 2 和 8 的硬币各一枚,得到硬币数组 [1,2,4,8,10] 。
可以证明从 1 到 19 的所有整数都可由数组中的硬币组合得到,且需要添加到数组中的硬币数目最小为 2 。

思路

我们观察上面例子中,如果只有硬币1,那么target只能为1,在此基础上添加硬币2,target就变为

3(原target+添加的硬币面额),再添加一枚硬币4,target就变为7

解释:原target值为3,表示原硬币数组能组成【1,2,3】这3个面额,添加硬币4后:

        面额4:直接由硬币4构成

        面额5:由硬币4与原本表示面额1构成

        面额6:由硬币4与原本表示面额2构成(以此类推)

以此类推:我们可以发现当新添加的硬币为原target+1时,target=target+(target+1)

                        如果新添加硬币小于target+1,target=target+新添加硬币面额(这里可以根据上

                        面同理得到)

     ! 但是当新添加硬币大于target+1时,就会出现断层:

                如:假设原本target值为3,添加了硬币5后,面额为4就无法用已有硬币表示。

现在我们就可以来完成这道题目了:   

      1.   对于给定硬币数组我们可以定义个值(i=0)表示当前所能表示的target值【注:当前指未

        使用硬币数组的任何一枚硬币】         

      2.  定义额外获得的硬币(指无法从硬币数组中获得的硬币,这也是本题要返回的值):coin

      3.  先对数组进行排序,这样我们可以方便我们判断对应的硬币与i的大小

      4. 定义一个下标index指向硬币数组

                      ->  如果当前硬币值小于或等于i+1,那么我们就可以

                        更新i--->i=i+coins【index】,并且移动下标index--->index++;

                      ->  如果当前硬币值大于i+1,那么就意味着我们需要额外获得硬币,

                        那么就让coin++,且更新i值,i=i+额外获得的硬币面额,

                        为了使返回值coin最小,额外获得的硬币面额应设置为最大值(i+1)

       5.最后当i>=target,便可结束

代码:

                       

        

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值