2023-07-09 353场 周赛 T4

69 阅读1分钟

#周赛 #Leetcode #差分

leetcode.cn/problems/ap…

题解

考虑nums[0]>0,则必须对0 - k-1下标的元素减去nums[0],然后再处理nums[1]

子数组同时加/减一个数 -> 差分数组

    public boolean checkArray(int[] nums, int k) {
        int n = nums.length;
        var d = new int[n+1];
        //d为差分数组,将nums[0] 到 nums[i+k-1] 的元素减1,等价于把d[i]减1,d[i+k]加1
        //注意子数组的长度必须为k,所以i <= n-k
        d[0] = nums[0];
        for (int i = 1; i < n; i++) {
            d[i] = nums[i] - nums[i-1];
        }
        for (int i = 0; i + k <= n; i++) {
            d[i + k] += d[i];
            d[i] = 0;
        }
        for (int i = 0; i < n; i++) {
            if (d[i] != 0) return false;
        }
        return true;
    }