3355. 零数组变换 I

问题描述

给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] = [li, ri]。

对于每个查询 queries[i]:

在 nums 的下标范围 [li, ri] 内选择一个下标 子集。
将选中的每个下标对应的元素值减 1。
零数组 是指所有元素都等于 0 的数组。

如果在按顺序处理所有查询后,可以将 nums 转换为 零数组 ,则返回 true,否则返回 false。

分析

可以每次将每个元素都-1,最后判断是否存在大于0的元素。暴力会卡时间,这个题用差分数组。
差分数组的第0项通常是原数组第0项。

差分后再求前缀和 <=> 求前缀和后再求差分 <=> 原数组

法一、暴力,会卡时间,测试案例664/668

class Solution {
public:
    bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
        int q_n = queries.size();
        for (int i = 0; i < q_n; i++) {
            vector<int> q_x = queries[i];
            int start = q_x[0], end = q_x[1];
            for (int j = start; j <= end; j++) {
                if (nums[j] == 0) {
                    continue;
                }
                nums[j]--;
            }
        }
        int n_n = nums.size();
        for (int i = 0; i < n_n; i++) {
            if (nums[i] != 0) {
                return false;
            }
        }
        return true;
    }
};

法二、差分

class Solution {
public:
    bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
        int n = nums.size();
        vector<int> diff(n+1, 0);
        diff[0] = nums[0];
        for (int i = 1; i < n; i++) {
            diff[i] = nums[i] - nums[i-1];
        }
        int q_n = queries.size();
        for (int i = 0; i < q_n; i++) {
            int l = queries[i][0], r = queries[i][1];
            diff[l]--; diff[r+1]++;
        }
        vector<int> last(n, 0);
        last[0] = diff[0];
        for (int i = 1; i < n; i++) {
            last[i] = diff[i] + last[i-1];
        }
        for (int i = 0; i < n; i++) {
            if (last[i] > 0) {
                return false;
            }
        }
        return true;
    }
};
posted @ 2025-05-20 18:17  saulstavo  阅读(29)  评论(0)    收藏  举报