https://leetcode.com/problems/patching-array/description/
题目:给一个有序非负整数列nums和一个整数n,最少需要添加多少个数可以使得[1,n]间的每一个数都可以被数列中若干个数的和来表示。输出最小需要添加多少个数字。
思路:定义整数id,[0,id)是现在能满足的区间,即[0,id)内的数字都能被表示出来。数列中往后读一个数num,如果num<=id,那么我们可以扩展区间为[0,id+num);如果num>id,那么我们就需要添加一个数字来扩展区间,最有效的值显然为id本身,区间扩展为[0,id+id)。定义id初始值为1,循环读取数列中的数字并扩展区间,直到id>n即可。
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
long long len=nums.size();
long long id=1,add=0,i=0;
while(id<=n){
if(i<len&&id>=nums[i]){
id+=nums[i++];
}
else{
id+=id;
add++;
}
}
return add;
}
};