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;
}
};