leetcode:3356. 零数组变换②
给你一个长度为 n 的整数数组 nums 和一个二维数组 queries
,其中 queries[i] = [li, ri, vali]
。
每个 queries[i]
表示在 nums
上执行以下操作:
- 将
nums
中[li, ri]
范围内的每个下标对应元素的值 最多 减少vali
。 - 每个下标的减少的数值可以独立选择。
零数组 是指所有元素都等于 0 的数组。
返回 k
可以取到的 最小非负 值,使得在 顺序 处理前 k 个查询后,nums
变成 零数组。如果不存在这样的 k
,则返回 -1。
示例 1:
输入: nums = [2,0,2], queries = [[0,2,1],[0,2,1],[1,1,3]]
输出: 2
解释:
- 对于 i = 0(l = 0, r = 2, val = 1):
- 在下标 [0, 1, 2] 处分别减少 [1, 0, 1]。
- 数组将变为 [1, 0, 1]。
- 对于 i = 1(l = 0, r = 2, val = 1):
- 在下标 [0, 1, 2] 处分别减少 [1, 0, 1]。
- 数组将变为 [0, 0, 0],这是一个零数组。因此,k 的最小值为 2。
示例 2:
输入: nums = [4,3,2,1], queries = [[1,3,2],[0,2,1]]
输出: -1
解释:
- 对于 i = 0(l = 1, r = 3, val = 2):
- 在下标 [1, 2, 3] 处分别减少 [2, 2, 1]。
- 数组将变为 [4, 1, 0, 0]。
- 对于 i = 1(l = 0, r = 2, val = 1):
- 在下标 [0, 1, 2] 处分别减少 [1, 1, 0]。
- 数组将变为 [3, 0, 0, 0],这不是一个零数组。
1. 暴力求解
暴力求解:倒在621/627
class Solution(object):
def minZeroArray(self, nums, queries):
"""
:type nums: List[int]
:type queries: List[List[int]]
:rtype: int
"""
# 暴力求解
arr = [1] * len(nums)
sum0 = 0
for num in nums:
sum0 += num
if sum0 == 0:
return 0
for epoch, (l, r, val) in enumerate(queries):
for i in range(l, r + 1):
# 通过数组arr,如果减到0,则之后不用下面的操作
if arr[i]:
if nums[i] > val:
nums[i] -= val
else:
nums[i] = 0
arr[i] = 0
sum = 0
for num in nums:
sum += num
if sum == 0:
return epoch + 1
return -1
2. 差分数组+二分查找
class Solution(object):
def minZeroArray(self, nums, queries):
"""
:type nums: List[int]
:type queries: List[List[int]]
:rtype: int
"""
# 差分数组+二分查找
def check(k):
diff = [0] * (len(nums) + 1)
for l, r, val in queries[:k]:
diff[l] += val
diff[r + 1] -= val
sum_i = 0
for i in range(len(nums)):
sum_i += diff[i]
if nums[i] > sum_i:
return False
return True
left = -1
right = len(queries) + 1
while left + 1 < right:
mid = (left + right) // 2
# 看中间mid是否满足条件使得零数组
if check(mid):
right = mid
else:
left = mid
return right if right <= len(queries) else -1
leedcodet评论题解
复杂度分析
时间复杂度:O((n+q)logq),其中 n 是 nums 的长度,q 是 queries 的长度。
空间复杂度:O(n)。Python 忽略切片空间。
链接:https://leetcode.cn/problems/zero-array-transformation-ii/solutions/2991505/liang-chong-fang-fa-er-fen-da-an-chai-fe-rcvg/
来源:力扣(LeetCode)