LeetCode 330. Patching Array

题目

题意:给你一个数组,问你还要加上多少个数字,可以让1-n中的人一个数字都可以由数组里的一些元素相加得来

题解:首先考虑这样一个情况,假设在数组的某个位置i上,已经满足了1~k的所有组合都在里头,那么到下一个元素i+1
将会有1~k+nums[I]的所有组合都可以找到,前提是nums[i]+1<=k。那如果nums[i]+1>k 怎么办呢?这个时候就是需要添置元素的时候了
我们添加一个元素k+1,再次得到1~k+k+1 此时k=k+k+1,再判断k和nums[i]+1的大小,直到nums[i]+1<=k

      要注意有超int的情况
typedef long long int _int;
class Solution {
public:
    int minPatches(vector<int>& nums, int n) {
        
        _int start = 1;
        _int pre=0;
        
        int ans=0;
        
        for(int i=0;i<nums.size();i++)
        {
            
            while(start<nums[i])
            {
                ans++;
                start = start + pre;
                pre=start;
                if(pre>=n)
                    return ans;
                start++;
            }
            
            start = (_int)nums[i] + pre;
            pre = start;
            start++;
            if(pre>=n)
                return ans;
        }
        
        
        while(start<=n)
        {
            ans++;
            start=start+pre;
            pre=start;
            start++;
        }
        
        return ans;
        
    }
};
posted @ 2020-03-14 20:09  Shendu.CC  阅读(91)  评论(0编辑  收藏  举报