LeetCode 330. Patching Array
题目大意是给出一个已经按升序排列的由正整数组成的数组nums和一个正整数n,要求至少加入多少个数之后使得数组能通过相加形成[1,n]之间的所有数。
思路如下:假设miss是第一个不能通过当前部分数组生成的数,即现在能生成数的区间为[0,miss-1]。 考虑接下来nums提供的数num(如果存在的话),可以通过在原区间的两端加上num生成一个新的区间[num,num+miss-1]。
- 若num<=miss,则两个区间可合并为一个区间[0,num+miss-1],num+miss成为新的miss
- 若num>miss或者说原数组已经用完不能再提供num,则两个区间将不能合并,需加入一个数patch_num替代num使得两区间能合并,为使表示的范围尽量大应取这个数patch_num=miss, 这样便会得到一个新的可生成数的区间[0, miss+miss-1],miss也会相应更新为miss+miss.
这样循环直到miss>n即可。
按照上面的思路,代码如下:
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
long miss = 1;
long patch = 0;
long i = 0;
long m = nums.size();
while(miss <= n ) {
if(i >= m || nums[i] > miss) {
patch++;
miss += miss;
} else {
miss += nums[i++];
}
}
return patch;
}
};