题意
告诉你几个元素组成的数组nums[ ]和表示范围n,问最少向数组中添加多少元素使得从nums[ ]中若干元素之和能够覆盖[1..n]
思路
cur表示当前能表示的范围为[1..cur],扫描nums[ ],贪心原则如下:
若nums[i]<=2*cur + 1,把nums[i]添加进来,表示范围更新[1..cur+nums[i]];
若nums[i]>2*cur + 1,添加新的元素cur+1,表示范围更新[1..2*cur+1].
cur从0开始
注意
cur可能溢出
class Solution {
public:
int minPatches(vector<int>& nums, int n) {
long long cur = 0;
int i = 0,add = 0;
while(cur<n){
if(i < nums.size()&&nums[i] <= cur + 1) {
cur +=nums[i];
i ++ ;
}
else {
add++;
cur = 2*cur + 1;
}
}
return add;
}
};