★ lc 330. Patching Array
https://leetcode.com/problems/patching-array/description/
给你一个数列a,以及一个数n,问你数列a里面最少再添加几个数,就可以用数列a中数字拼凑出1~n任意情况。
又是贪心,直接从中间某情况考虑,假设我们现在使用a的前j个元素在添加了ans个元素的情况下,能拼出1~k,那么我们如果a[j+1]是小于等于k的,那么我们能利用a[j+1]把这个范围拓展到1~k+a[j+1],这样就k+=a[j+1]再去找下一个j位置,直到a[j+1]>k,意味着出现了一个数k+1,不能被当前这些数搞定,那么我们就要添加一个数使之可以,添加的x可以有很多取值,实际上1~k+1都可以,因为我们能拼出1~k,那么到底添加几呢?当然是添加后能最大拓展这个范围的了,于是就是最大的k+1。于是现在范围变成了k=k*2+1,再用这个新k去吞噬a中元素直到再次出现a[j+1]>k。
这样子有点难以编写开始条件,我们不用可以组出来的1~k的k,而用第一个拼不出的数字k+1,用need来表示,这样把need初始化为1就行了。
所以我们不用把这些添加的数字真正的加到a里面,简单的数值计算就行了。
code:
class Solution: def minPatches(self, nums, n): need=1 ans=0 i=0 while need<=n: while i<len(nums) and nums[i]<=need: need+=nums[i] i+=1 if need>n: break ans+=1 need*=2 print(ans) return ans