3362. Zero Array Transformation III
Description
You are given an integer array nums
of length n
and a 2D array queries
where queries[i] = [li, ri]
.
Each queries[i]
represents the following action on nums
:
- Decrement the value at each index in the range
[li, ri]
innums
by at most1. - The amount by which the 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 maximum number of elements that can be removed from queries
, such that nums
can still be converted to a zero array using the remaining queries. If it is not possible to convert nums
to a zero array, return -1.
Example 1:
Input: nums = [2,0,2], queries = [[0,2],[0,2],[1,1]]
Output: 1
Explanation:
After removing queries[2]
, nums
can still be converted to a zero array.
- Using
queries[0]
, decrementnums[0]
andnums[2]
by 1 andnums[1]
by 0. - Using
queries[1]
, decrementnums[0]
andnums[2]
by 1 andnums[1]
by 0.
Example 2:
Input: nums = [1,1,1,1], queries = [[1,3],[0,2],[1,3],[1,2]]
Output: 2
Explanation:
We can remove queries[2]
and queries[3]
.
Example 3:
Input: nums = [1,2,3,4], queries = [[0,3]]
Output: -1
Explanation:
nums
cannot be converted to a zero array even after using all the queries.
Constraints:
1 <= nums.length <= 105
0 <= nums[i] <= 105
1 <= queries.length <= 105
queries[i].length == 2
0 <= li <= ri < nums.length
Solutions
Solution: Priority Queue
- Time complexity: O((m+n)logm)
- Space complexity: O(m)
JavaScript
/**
* @param {number[]} nums
* @param {number[][]} queries
* @return {number}
*/
const maxRemoval = function (nums, queries) {
const m = queries.length;
const n = nums.length;
const available = new MaxPriorityQueue();
const running = new MinPriorityQueue();
let queryIndex = 0;
queries.sort((a, b) => a[0] - b[0]);
for (let index = 0; index < n; index++) {
const value = nums[index];
while (queryIndex < m && queries[queryIndex][0] <= index) {
const right = queries[queryIndex][1];
available.enqueue(right);
queryIndex += 1;
}
while (running.size() && running.front() < index) {
running.dequeue();
}
while (value > running.size()) {
if (!available.size() || available.front() < index) {
return -1;
}
const right = available.dequeue();
running.enqueue(right);
}
}
return available.size();
};