初学python记录:力扣2952. 需要添加的硬币的最小数量

文章介绍了如何使用贪心算法解决给定一组硬币面值和一个目标整数,找到需要添加的最少硬币数量,使得[1,target]内的每个整数都能由硬币子序列组成。关键步骤包括计算上限、排序硬币和调整策略以保证连续性。
摘要由CSDN通过智能技术生成

题目:

给你一个下标从 开始的整数数组 coins,表示可用的硬币的面值,以及一个整数 target 。

如果存在某个 coins 的子序列总和为 x,那么整数 x 就是一个 可取得的金额 

返回需要添加到数组中的 任意面值 硬币的 最小数量 ,使范围 [1, target] 内的每个整数都属于 可取得的金额 。

数组的 子序列 是通过删除原始数组的一些(可能不删除)元素而形成的新的 非空 数组,删除过程不会改变剩余元素的相对位置。

思考:

数学推导——若目前硬币已经能组合得到[1,x]的所有整数,现在加入硬币y,那么能够组合得到的所有整数为[1,x]U[y,x+y],要使得这个结果中间没有缺少的整数且包含最多的整数,则x+1=y,也就是说,最贪心的加硬币的方式是加入的硬币y比原来能得到的连续整数最大值大1

1. 初始化:能得到的连续整数最大值ulimit初始为0,加入硬币的数量初始为0

2. 将数组coins升序排序

3. 逐个访问coins内的硬币coin,若coin <= ulimit+1(coin加入后,可得到的整数是连续的),则增加上限,即最大值ulimit更新为原ulimit+coin;否则,增加硬币ulimit+1,并重新升序排序数组coins,更新ulimit,增加加入硬币的数量

4. 直到ulimit >= target为止

代码如下:

class Solution(object):
    def minimumAddedCoins(self, coins, target):
        """
        :type coins: List[int]
        :type target: int
        :rtype: int
        """
        ulimit = 0  # 可以连续取到的[1,ulimit]的上限
        result = 0
        coins.sort()
        i = 0
        while True:
            n = len(coins)
            if i < n and coins[i] <= ulimit + 1:          # 增加上限
                ulimit += coins[i]
            else:              # 增加硬币
                coins.append(ulimit + 1)
                coins.sort()
                ulimit = ulimit*2 + 1
                result += 1
            if ulimit >= target:
                return result
            i += 1

提交通过:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值