这种贪心题目,需要理解思路,具有跳跃性
从前往后枚举原数组的每一个元素,每到一个元素,记录下当前所能包括的区间,假设之前所枚举到的数nums[i - 1],可以包含区间为
[0,x)
那么加入现在这个数nums[i],后,可以包含的区间为多少?
分成两种情况:
- nums[i] <= x
- nums[i] > x
第一种情况,加入nums[i]后,所能涵盖的区间变成了:
[0,x + nums[i])
第二种情况计入nums[i]后所能涵盖的区间为
[0, x) ∪ [nums[i], nums[i] + x)
而第二种显然不能包含所有区间,所以需要加入元素,加入哪个元素,可以使得加入的元素个数最少?显然加入x,因为加入x可以使得加入一个数,且涵盖的区间最大。这样答案就明显了:
code
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
long long x = 1; // 避免int 相加越界
int i = 0 , res = 0;
while (x <= n) {
if (i < nums.size() && nums[i] <= x) x += nums[i++];
else {
x += x;
res ++;
}
}
return res;
}
};