3643. Zero Array Transformation Ii¶
3643. Zero Array Transformation II
Medium
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
Solution¶
class Solution {
public int minZeroArray(int[] nums, int[][] queries) {
int n = nums.length;
int low = 0, high = queries.length - 1, ans = -1;
boolean flag = true;
for (int ele : nums) if (ele != 0) flag = false;
if (flag == true) return 0;
while (low <= high) {
int mid = low + (high - low) / 2;
if (ok(mid, queries, nums)) {
ans = mid;
high = mid - 1;
}
else low = mid + 1;
}
if (ans == -1) return -1;
return ans + 1;
}
private boolean ok(int mid, int[][] queries, int nums[]) {
int n = nums.length;
int arr[] = new int[n];
for (int i = 0; i <= mid; i++) {
int l = queries[i][0], r = queries[i][1], val = queries[i][2];
arr[l] += val;
if (r + 1 < n) arr[r + 1] -= val;
}
for (int i = 1; i < n; i++) arr[i] += arr[i - 1];
for (int i = 0; i < n; i++) {
if (nums[i] > arr[i]) return false;
}
return true;
}
}
Complexity Analysis¶
- Time Complexity: O(?)
- Space Complexity: O(?)
Explanation¶
[Add detailed explanation here]