leetcode每日一题—330.按要求补齐数组

题目:
给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。
在这里插入图片描述

思路:
这老哥可太优秀了,讲得通俗易懂呀
在这里插入图片描述
假设当前未能覆盖的最小值为min_uncover,(即1,2,…,min_uncover-1均被覆盖),记i为数组的遍历索引,则可分两种情况讨论:
(1)若nums[i]>min_uncover 或者 i>=len(nums),则需要将min_uncover加入,则当前可被覆盖的值变为:1,2,…,min_uncover-1 和 min_uncover,…,2min_uncover-1 。此时min_uncover更新为2min_uncover;
(2)若i<len(nums) 且 nums[i]<=min_uncover,则当前可覆盖的值变为:1,2,…,min_uncover-1和min_uncover-1+nums[i]。此时min_uncover更新为 min_uncover+nums[i]。

解答:

class Solution:
    def minPatches(self, nums: List[int], n: int) -> int:
        #min_uncover 表示当前未能覆盖的最小值
        min_uncover,i,res=1,0,0
        nl=len(nums)
        while min_uncover<=n:
            if i<nl and min_uncover >= nums[i]:
                min_uncover+=nums[i]
                i+=1
            else:
                min_uncover*=2
                res+=1
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值