LeetCode/使数组中的所有元素都等于零(差分数组)
给你一个下标从 0 开始的整数数组 nums 和一个正整数 k 。
你可以对数组执行下述操作 任意次 :
从数组中选出长度为 k 的任一子数组,并将子数组中每个元素都减去 1
如果你可以使数组中的所有元素都等于 0 ,返回 true ,否则,返回 false。
1. 差分数组
从左往右贪心进行削减为0,对于整个区间删减,使用差分数组
class Solution {
public:
bool checkArray(vector<int>& nums, int k) {
int n = nums.size();
vector<int> diff(n);
vector<int> dp(n);//记录修改后的数
if(k<n) diff[k] = nums[0];
for(int i=1;i<n;i++){
dp[i] = nums[i] + dp[i-1] - nums[i-1]+ diff[i];//修改当前数
if(dp[i]<0) return false;
//对(i,i+k)区间内元素进行削减,削减量为dp[i]
diff[i] = - dp[i]; //左边界修改
if(i+k<n) diff[i+k] = diff[i+k] + dp[i];//右边界修改
if(i>n-k&&dp[i]!=0) return false;
dp[i] = 0; //修改为0
}
return true;
}
};