LeetCode in Kotlin

3362. Zero Array Transformation III

Medium

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:

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.

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:

Solution

import java.util.PriorityQueue

class Solution {
    fun maxRemoval(nums: IntArray, queries: Array<IntArray>): Int {
        queries.sortWith { a: IntArray, b: IntArray -> a[0] - b[0] }
        val last = PriorityQueue<Int?>(Comparator { a: Int?, b: Int? -> b!! - a!! })
        val diffs = IntArray(nums.size + 1)
        var idx = 0
        var cur = 0
        for (i in nums.indices) {
            while (idx < queries.size && queries[idx][0] == i) {
                last.add(queries[idx][1])
                idx++
            }
            cur += diffs[i]
            while (cur < nums[i] && last.isNotEmpty() && last.peek()!! >= i) {
                cur++
                diffs[last.poll()!! + 1]--
            }
            if (cur < nums[i]) {
                return -1
            }
        }
        return last.size
    }
}