★ 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

 

posted @ 2018-10-08 12:27  Cloud.9  阅读(119)  评论(0编辑  收藏  举报