leetcode第353场周赛 4 - 差分数组维护区间修改
2772. 使数组中的所有元素都等于零
题意
给你一个数组,你可以进行任意次操作:选择 k 个数组里连续的数均减去 1,问最后能否得到一个全 0 数组?
思路
从前往后考虑问题,第一个数字如果不是 0,那么它必须进行 a[0] 次操作使自己变成 0。那么第一个处理完了,是不是考虑第二个了?那第二个不是一样的考虑策略吗?
所以我们从前往后处理问题,如果说 \(a[i] = 0\),直接跳过;如果说 $a[i] > 0 $ ,那么需要进行选后面 k 个进行 a[i] 次操作,那么这里为了节约时间复杂度,可以单开一个差分数组维护区间修改;如果 $a[i] < 0 $,那么 false,没有增大操作。
差分数组维护区间修改,前缀和即为元素值;或者维护修改值,前缀和即为选定位修改值
代码
class Solution {
public:
//从前往后考虑问题
bool checkArray(vector<int>& a, int k) {
int n = a.size();
vector<int> d(n + 1, 0); //差分数组
long long sum = 0, x = 0;
for(int i = 0; i < n; ++ i){
sum += d[i];
x = a[i] + sum;
if(x == 0) continue;
if(i + k > n || x < 0) return false;
d[i + k] += x;
sum -= x;
}
return true;
}
};
本文来自博客园,作者:Qiansui,转载请注明原文链接:https://www.cnblogs.com/Qiansui/p/17592413.html