题目:
今天这题我拿到的时候是完全没有头绪的,后来看了看题解,发现难点并不是在代码上,而是在于怎么用数学的方法去思考这个问题。
思路:
1.我们对于任何的一个正整数x,假如数组Nums可以让【1,x-1】区间内的所有数字被覆盖,则可以让【1,2x-1】内的所有数组被覆盖。因为只需要对每一个组合加上X即可。
2.而如果x缺失,则需要添加一个小于等于x的数字才能让Nums覆盖到x。从贪心的角度考虑,我们直接补充这个数字为X,因为这样在补充之后可以得到更大的整数覆盖区间,满足题目要求
3.那么算法的思路就有了,题解解释的比较精炼:
需要注意的是,我们只用求出补充的数字个数,而不用返回补充后的nums数组,所以代码可以有简化,即不用更新nums数组
C++代码:
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
int patches = 0;
long long x = 1;
int length = nums.size(), index = 0;
while (x <= n) {
if (index < length && nums[index] <= x) {
x += nums[index];
index++;//当nums数组还有剩余值
} else {
x <<= 1;
patches++;
}
}
return patches;
}
};