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:
[li, ri] from nums.vali.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:
[0, 2] by 1.[1, 0, 1].[0, 2] by 1.[0, 0, 0], which is a Zero Array. Therefore, the minimum value of k is 2.Example 2:
Input: nums = [4,3,2,1], queries = [[1,3,2],[0,2,1]]
Output: -1
Explanation:
It is impossible to make nums a Zero Array even after all the queries.
Example 3:
Input: nums = [1,2,3,2,1], queries = [[0,1,1],[1,2,1],[2,3,2],[3,4,1],[4,4,1]]
Output: 4
Explanation:
[0, 1] by 1.[0, 1, 3, 2, 1].[1, 2] by 1.[0, 0, 2, 2, 1].[2, 3] by 2.[0, 0, 0, 0, 1].[0, 0, 0, 0, 0]. Therefore, the minimum value of k is 4.Example 4:
Input: nums = [1,2,3,2,6], queries = [[0,1,1],[0,2,1],[1,4,2],[4,4,4],[3,4,1],[4,4,5]]
Output: 4
Constraints:
1 <= nums.length <= 100 <= nums[i] <= 10001 <= queries.length <= 1000queries[i] = [li, ri, vali]0 <= li <= ri < nums.length1 <= vali <= 10import kotlin.math.max
import kotlin.math.min
class Solution {
private fun solve(q: Array<IntArray>, i: Int, target: Int, k: Int, dp: Array<IntArray>): Int {
// we found a valid sum equal to target so return current index of query.
if (target == 0) {
return k
}
// return a larger number to invalidate this flow
if (k >= q.size || target < 0) {
return q.size + 1
}
if (dp[target][k] != -1) {
return dp[target][k]
}
// skip current query val
var res = solve(q, i, target, k + 1, dp)
// pick the val if its range is in the range of target index
if (q[k][0] <= i && i <= q[k][1]) {
res = min(res, solve(q, i, target - q[k][2], k + 1, dp))
}
dp[target][k] = res
return res
}
fun minZeroArray(nums: IntArray, queries: Array<IntArray>): Int {
var ans = -1
for (i in nums.indices) {
val dp = Array<IntArray>(nums[i] + 1) { IntArray(queries.size) }
dp.forEach { row: IntArray -> row.fill(-1) }
ans = max(ans, solve(queries, i, nums[i], 0, dp))
}
return if (ans > queries.size) -1 else ans
}
}