3356. Zero Array Transformation II
Description
You are given an integer array nums of length n and a 2D array queries where queries[i] = [li, ri, vali].
Each queries[i] represents the following action on nums:
- Decrement the value at each index in the range
[li, ri]innumsby at mostvali. - The amount by which each value is decremented can be chosen independently for each index.
A Zero Array is an array with all its elements equal to 0.
Return the minimum possible non-negative value of k, such that after processing the first k queries in sequence, nums becomes a Zero Array. If no such k exists, return -1.
Example 1:
Input: nums = [2,0,2], queries = [[0,2,1],[0,2,1],[1,1,3]]
Output: 2
Explanation:
- For i = 0 (l = 0, r = 2, val = 1):
- Decrement values at indices
[0, 1, 2]by[1, 0, 1]respectively. - The array will become
[1, 0, 1].
- Decrement values at indices
- For i = 1 (l = 0, r = 2, val = 1):
- Decrement values at indices
[0, 1, 2]by[1, 0, 1]respectively. - The array will become
[0, 0, 0], which is a Zero Array. Therefore, the minimum value ofkis 2.
- Decrement values at indices
Example 2:
Input: nums = [4,3,2,1], queries = [[1,3,2],[0,2,1]]
Output: -1
Explanation:
- For i = 0 (l = 1, r = 3, val = 2):
- Decrement values at indices
[1, 2, 3]by[2, 2, 1]respectively. - The array will become
[4, 1, 0, 0].
- Decrement values at indices
- For i = 1 (l = 0, r = 2, val = 1):
- Decrement values at indices
[0, 1, 2]by[1, 1, 0]respectively. - The array will become
[3, 0, 0, 0], which is not a Zero Array.
- Decrement values at indices
Constraints:
1 <= nums.length <= 1050 <= nums[i] <= 5 * 1051 <= queries.length <= 105queries[i].length == 30 <= li <= ri < nums.length1 <= vali <= 5
Solutions
Solution 1: Difference Array + Binary Search
We notice that the more queries we use, the easier it is to turn the array into a zero array, which shows monotonicity. Therefore, we can use binary search to enumerate the number of queries and check whether the array can be turned into a zero array after the first \(k\) queries.
We define the left boundary \(l\) and right boundary \(r\) for binary search, initially \(l = 0\), \(r = m + 1\), where \(m\) is the number of queries. We define a function \(\text{check}(k)\) to indicate whether the array can be turned into a zero array after the first \(k\) queries. We can use a difference array to maintain the value of each element.
Define an array \(d\) of length \(n + 1\), initialized to all \(0\). For each of the first \(k\) queries \([l, r, val]\), we add \(val\) to \(d[l]\) and subtract \(val\) from \(d[r + 1]\).
Then we iterate through the array \(d\) in the range \([0, n - 1]\), accumulating the prefix sum \(s\). If \(\textit{nums}[i] > s\), it means \(\textit{nums}\) cannot be transformed into a zero array, so we return \(\textit{false}\).
During the binary search, if \(\text{check}(k)\) returns \(\text{true}\), it means the array can be turned into a zero array, so we update the right boundary \(r\) to \(k\); otherwise, we update the left boundary \(l\) to \(k + 1\).
Finally, we check whether \(l > m\). If so, return -1; otherwise, return \(l\).
The time complexity is \(O((n + m) \times \log m)\), and the space complexity is \(O(n)\), where \(n\) and \(m\) are the lengths of the array \(\textit{nums}\) and \(\textit{queries}\), respectively.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |