Zero Array Transformation II

medium two pointers difference array prefix sum

Problem

You are given an array nums and a list of queries, where each queries[i] = [l, r, val] lets you decrement every index in [l, r] by at most val (the amount is chosen independently per index). Processing the first k queries in order, return the minimum non-negative k after which nums can become all zeros. If impossible, return -1.

Inputnums = [2,0,2], queries = [[0,2,1],[0,2,1],[1,1,3]]
Output2
After 2 queries, indices 0 and 2 each receive 1 + 1 = 2 of available decrement, so [2,0,2] can reach [0,0,0].

def minZeroArray(nums, queries):
    n = len(nums)
    diff = [0] * (n + 1)        # difference array for range decrements
    k = 0                       # how many queries consumed (the answer)
    running = 0                 # decrement available at the current index
    for i in range(n):
        running += diff[i]      # extend prefix sum into index i
        # pull in queries until index i can drop to 0
        while running < nums[i] and k < len(queries):
            l, r, val = queries[k]
            k += 1
            if r < i:
                continue        # this query does not cover index i
            start = max(l, i)
            diff[start] += val
            diff[r + 1] -= val
            if start == i:
                running += val  # affects the current index right away
        if running < nums[i]:
            return -1           # even all queries cannot zero index i
    return k
function minZeroArray(nums, queries) {
  const n = nums.length;
  const diff = new Array(n + 1).fill(0); // difference array
  let k = 0;            // queries consumed (the answer)
  let running = 0;      // decrement available at current index
  for (let i = 0; i < n; i++) {
    running += diff[i]; // extend prefix sum into index i
    // pull in queries until index i can drop to 0
    while (running < nums[i] && k < queries.length) {
      const [l, r, val] = queries[k];
      k++;
      if (r < i) continue; // does not cover index i
      const start = Math.max(l, i);
      diff[start] += val;
      diff[r + 1] -= val;
      if (start === i) running += val; // hits current index now
    }
    if (running < nums[i]) return -1;  // cannot zero index i
  }
  return k;
}
int minZeroArray(int[] nums, int[][] queries) {
    int n = nums.length;
    int[] diff = new int[n + 1];   // difference array
    int k = 0;                     // queries consumed (the answer)
    long running = 0;              // decrement available at index i
    for (int i = 0; i < n; i++) {
        running += diff[i];        // extend prefix sum into index i
        // pull in queries until index i can drop to 0
        while (running < nums[i] && k < queries.length) {
            int l = queries[k][0], r = queries[k][1], val = queries[k][2];
            k++;
            if (r < i) continue;   // does not cover index i
            int start = Math.max(l, i);
            diff[start] += val;
            diff[r + 1] -= val;
            if (start == i) running += val; // hits current index now
        }
        if (running < nums[i]) return -1;   // cannot zero index i
    }
    return k;
}
int minZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
    int n = nums.size();
    vector<long long> diff(n + 1, 0); // difference array
    int k = 0;                       // queries consumed (the answer)
    long long running = 0;           // decrement available at index i
    for (int i = 0; i < n; i++) {
        running += diff[i];          // extend prefix sum into index i
        // pull in queries until index i can drop to 0
        while (running < nums[i] && k < (int)queries.size()) {
            int l = queries[k][0], r = queries[k][1], val = queries[k][2];
            k++;
            if (r < i) continue;     // does not cover index i
            int start = max(l, i);
            diff[start] += val;
            diff[r + 1] -= val;
            if (start == i) running += val; // hits current index now
        }
        if (running < nums[i]) return -1;   // cannot zero index i
    }
    return k;
}
Time: O(n + q) Space: O(n)