解法真的厉害!学习了!
这道题给我们一个有序的正数数组nums,又给了我们一个正整数n,问我们最少需要给nums加几个数字,使其能组成[1,n]之间的所有数字,注意数组中的元素不能重复使用。
我们定义一个变量miss,用来表示[0,n]之间最小的不能表示的值,那么初始化为1。那么此时我们能表示的范围是[0, miss),表示此时我们能表示0到miss-1的数,如果此时的num <= miss,那么我们可以把我们能表示数的范围扩大到[0, miss+num),如果num>miss,那么此时我们需要添加一个数,为了能最大限度的增加表示数范围,我们加上miss它本身,以此类推直至遍历完整个数组。
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
long long miss = 1, i = 0, ans = 0;
while( miss <= n ){
if( i < nums.size() && miss >= nums[i] ){
miss += nums[i++];
}else{
miss += miss;
ans++;
}
}
return ans;
}
};