代码第三十六天:需要添加的硬币的最小数量

文章介绍了如何使用贪心策略解决一个关于整数区间合并的问题,通过排序硬币列表并分情况合并区间,以找到最少需要添加的硬币数量,使得区间包含目标整数。时间复杂度为O(nlogn+logtarget),空间复杂度为O(1)。
摘要由CSDN通过智能技术生成

需要添加的硬币的最小数量

题目要求:

在这里插入图片描述

解题思路

为方便描述,把 0 也算作可以得到的数。

假设现在得到了区间 [ 0 , s − 1 ] [0,s−1] [0,s1] 中的所有整数,如果此时遍历到整数 x = c o i n s [ i ] x=coins[i] x=coins[i],那么把 [ 0 , s − 1 ] [0,s−1] [0,s1] 中的每个整数都增加 x x x,我们就得到了区间 [ x , s + x − 1 ] [x,s+x−1] [x,s+x1] 中的所有整数。

思路
c o i n s coins coins 从小到大排序,遍历 x = c o i n s [ i ] x=coins[i] x=coins[i]。分类讨论,看是否要添加数字:

  • 如果 x ≤ s x \le s xs,那么合并 [ 0 , s − 1 ] [0,s−1] [0,s1] [ x , s + x − 1 ] [x,s+x−1] [x,s+x1] 这两个区间,我们可以得到 [ 0 , s + x − 1 ] [0,s+x−1] [0,s+x1] 中的所有整数。
  • 如果 x > s x>s x>s,或者遍历完了 c o i n s coins coins 数组,这意味着我们无法得到 s s s,那么就一定要把 s s s 加到数组中(加一个比 s s s 还小的数字就没法得到更大的数,不够贪),这样就可以得到了 [ s , 2 s − 1 ] [s,2s−1] [s,2s1] 中的所有整数,再与 [ 0 , s − 1 ] [0,s−1] [0,s1] 合并,可以得到 [ 0 , 2 s − 1 ] [0,2s−1] [0,2s1] 中的所有整数。然后再考虑 x x x 2 s 2s 2s 的大小关系,继续分类讨论。

s > t a r g e t s s>targets s>targets时,我们就得到了 [ 1 , t a r g e t ] [1,target] [1,target] 中的所有整数,退出循环。

代码


class Solution:
    def minimumAddedCoins(self, coins: List[int], target: int) -> int:
        coins.sort()
        ans, s, i = 0,1,0
        while s<= target:
            if i<len(coins) and coins[i]<=s:
                s += coins[i]
                i+=1
            else:
                s *= 2
                ans +=1
        return ans

复杂度分析

  • 时间复杂度: O ( n l o g ⁡ n + l o g ⁡ t a r g e t ) O(nlog⁡n+log⁡target) O(nlogn+logtarget),其中 n n n c o i n s coins coins 的长度。 s s s 至多翻倍 O ( l o g ⁡ t a r g e t ) O(log⁡target) O(logtarget) 次。瓶颈主要在排序上。
    空间复杂度: O ( 1 ) O(1) O(1)。忽略排序的栈开销。

参考

灵茶山艾府

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

alstonlou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值