330. 按要求补齐数组
给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。
思路
- 假定[1, x - 1]区间的任何数字已经可以表达,如果x也在数组中,则[1, 2x - 1]也可以表达,如果x不在数组中,则可以贪心地往数组中添加x,因为添加小于x的任何值,都达不到[1, 2x - 1]的区间长度。
- 遍历数组,初始化x为1,则[1, x - 1]为空区间,如果nums[index] <= x,则更新x为x + nums[index],此时区间为[1, x + nums[index] - 1],index自增。如果nums[index] > x,证明x不存在数组中,往数组贪心添加x,添加次数自增,x更新为2x,区间变为[1, 2x - 1]。直到x大于n即可。
代码
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
int ans = 0;
long long x = 1;
int len = nums.size();
int index = 0;
while(x <= n) {
if(index < len && nums[index] <= x) {
x = x + nums[index];
++index;
}
else {
x <<= 1;
++ans;
}
}
return ans;
}
};