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;
    }
};
posted @ 2023-07-10 00:30  失控D大白兔  阅读(24)  评论(0编辑  收藏  举报