题目:
给定一个已排序的正整数数组 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