Bootstrap

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
;