思路
对一段区间加减并且进行多次操作可以联想到差分算法,并且queries数组比较大,可以使用二分查找加快效率。这里的代码个人觉得lambda表达式更加简洁
代码
int minZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
int n=nums.size(),q=queries.size();
auto check=[&](int k){
vector<int>a(n+1);
for(int i=0;i<k;i++){
auto&c=queries[i];
a[c[0]]+=c[2];//设置一个数组将val进行操作的变化值存储,不用对nums构建差分数组
a[c[1]+1]-=c[2];
}
int sum=0;
for(int i=0;i<n;i++){
sum+=a[i];//再求和获得每一个位置上的进行操作赋予的值
if(nums[i]>sum)return false;//判断目前的val的操作是否能实现把所有nums元素都变成0,
//如果nums[i]>sum说明还有数值没有减到0,需要继续向下计算
}
return true;
};
if(!check(q))return -1;
int head=-1,tail=q;
while(head+1<tail){
int mid=(head+tail)/2;//这里直接套用而二分的模版
if(!check(mid))head=mid;//这里返回为假还需要增大k值
else tail=mid;
}
return tail;
}
标签:return,nums,变换,II,int,数组,queries,check
From: https://www.cnblogs.com/hyien/p/18684386