Leetcode 2772. 使数组中的所有元素都等于零

https://leetcode.cn/problems/apply-operations-to-make-all-array-elements-equal-to-zero/description/
给你一个下标从 0 开始的整数数组 nums 和一个正整数 k 。
你可以对数组执行下述操作 任意次 :
从数组中选出长度为 k 的 任一 子数组,并将子数组中每个元素都 减去 1 。
如果你可以使数组中的所有元素都等于 0 ,返回 true ;否则,返回 false 。
子数组 是数组中的一个非空连续元素序列。

示例 1:
输入:nums = [2,2,3,1,1,0], k = 3
输出:true
解释:可以执行下述操作:

  • 选出子数组 [2,2,3] ,执行操作后,数组变为 nums = [1,1,2,1,1,0] 。
  • 选出子数组 [2,1,1] ,执行操作后,数组变为 nums = [1,1,1,0,0,0] 。
  • 选出子数组 [1,1,1] ,执行操作后,数组变为 nums = [0,0,0,0,0,0] 。

示例 2:
输入:nums = [1,3,1,1], k = 2
输出:false
解释:无法使数组中的所有元素等于 0 。

提示:
1 <= k <= nums.length <= 10^5
0 <= nums[i] <= 10^6

数组转化成差分数组
根据差分的定义 长度为k的数组元素一同操作 则等于a[i]+=x a[i+k]-=x
从左到右 已经处理的元素不涉及后面的元素处理 如果任意遍历到的差分数组元素无法处理 则原数组不可能完成要求

class Solution {
public:
    bool checkArray(vector<int>& nums, int k) {
        int arr[100010];memset(arr,0,sizeof arr);
        nums.insert(nums.begin(),0);
        //制作差分数组
        for(int i= 1;i<nums.size();i++){
            arr[i] = nums[i]-nums[i-1];
        }
        //如果差分数组最后全为0 则说明符合求
        //从左到右 已经处理的元素不涉及后面的元素处理
        // 当前元素>0 则进行差分数组 a[i]-=x   a[i+k]+=x 处理,等于原数组 K长度的元素统一减去x
        // 当前元素 <0  说明原数组K距离内前面元素大后面元素下  但是数组操作只有减没有加, 则无法处理 返回false   9 2 8 1, k=2
        // 当前元素>0 但是到结尾没有k长度 也无法处理 返回false 比如 1 1 1 8  K=4 的例子
        for(int i =0;i < nums.size();i++){
            if(arr[i]>0 && i+k <= nums.size()){
                int nn = arr[i];
                arr[i] -=nn;
                arr[i+k] += nn;
            }else if(arr[i] != 0){return false;}
        }
        return true;
    }
};

posted on 2026-09-17 19:31  itdef  阅读(6)  评论(0)    收藏  举报

导航