Zero Array Transformation I

medium array prefix sum difference array

Problem

You are given an array nums and a list of queries, where each queries[i] = [l, r]. For each query you may pick any subset of indices inside [l, r] and decrement each picked value by 1. After running all queries in order, return true if every element can be made 0.

Because the subset is free per query, index i can be zeroed exactly when the number of queries whose range covers i is at least nums[i]. So the answer is true iff nums[i] ≤ coverage[i] for all i.

Inputnums = [1,0,1], queries = [[0,2]]
Outputtrue
The single query covers indices 0..2 once each, so coverage = [1,1,1] ≥ nums = [1,0,1]. All can reach 0.

def isZeroArray(nums, queries):
    n = len(nums)
    diff = [0] * (n + 1)            # difference array
    for l, r in queries:
        diff[l] += 1               # +1 where coverage starts
        diff[r + 1] -= 1           # -1 just past where it ends
    cover = 0
    for i in range(n):
        cover += diff[i]           # prefix sum = times index i is covered
        if nums[i] > cover:        # not enough decrements available
            return False
    return True
function isZeroArray(nums, queries) {
  const n = nums.length;
  const diff = new Array(n + 1).fill(0);   // difference array
  for (const [l, r] of queries) {
    diff[l] += 1;                          // +1 where coverage starts
    diff[r + 1] -= 1;                       // -1 just past where it ends
  }
  let cover = 0;
  for (let i = 0; i < n; i++) {
    cover += diff[i];                       // prefix sum = coverage of i
    if (nums[i] > cover) return false;       // not enough decrements
  }
  return true;
}
boolean isZeroArray(int[] nums, int[][] queries) {
    int n = nums.length;
    int[] diff = new int[n + 1];          // difference array
    for (int[] q : queries) {
        diff[q[0]] += 1;                  // +1 where coverage starts
        diff[q[1] + 1] -= 1;              // -1 just past where it ends
    }
    int cover = 0;
    for (int i = 0; i < n; i++) {
        cover += diff[i];                 // prefix sum = coverage of i
        if (nums[i] > cover) return false; // not enough decrements
    }
    return true;
}
bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
    int n = nums.size();
    vector<int> diff(n + 1, 0);            // difference array
    for (auto& q : queries) {
        diff[q[0]] += 1;                  // +1 where coverage starts
        diff[q[1] + 1] -= 1;              // -1 just past where it ends
    }
    int cover = 0;
    for (int i = 0; i < n; i++) {
        cover += diff[i];                 // prefix sum = coverage of i
        if (nums[i] > cover) return false; // not enough decrements
    }
    return true;
}
Time: O(n + queries) Space: O(n)