3356. 零数组变换 II

题目来源:

        LeetCode题目:3356. 零数组变换 II - 力扣(LeetCode)

解题思路:

       在差分数组的基础上进行优化。首先确定数组中第一个非 0 位置 notZeroPos,对于queries中 的每个查询:

        1.若该区间完全处于 notZeroPos 左边,则不会对后续判断造成影响,跳过

        2.若该区间完全处于 notZeroPos 右边,可能会对后续判断造成影响,更新差分数组

        3.若 notZeroPos 处于该区间 [start,end] 内,因为 [start,notZeroPos) 不会对结果 产生影响,因此可以只更新 [notZeroPos,end] 的部分。

        根据以上内容对当前 query 处理完毕后,从 notZeroPos 开始判断直至找到下一个不能完成 0 

变换的位置或者超出所给数组范围并更新前缀和。由于1,2不会对notZeroPos 位置的元素能否置0产生影响,因此可以将该判断写在条件3中。

解题代码:

#python3
class Solution:
    def minZeroArray(self, nums: List[int], queries: List[List[int]]) -> int:
        notZeroPos=0
        for i in range(len(nums)):
            if nums[i]==0:
                notZeroPos += 1
            else:
                break
        if notZeroPos==len(nums):
            return 0
        cnt=[0]*(len(nums)+1)
        total=0
        for i in range(len(queries)):
            #cnt[queries[i][0]] += queries[i][2]
            #cnt[queries[i][1]+1]    -=  queries[i][2]
            if queries[i][0]>notZeroPos:
                cnt[queries[i][0]] += queries[i][2]
                cnt[queries[i][1]+1]    -=  queries[i][2]
            elif queries[i][1]=nums[notZeroPos]:
                        total=total+cnt[notZeroPos]
                        notZeroPos=notZeroPos+1
                    else:
                        break
                if notZeroPos==len(nums):
                    return i+1  
        return -1

        

总结:

        官方题解给出了两种解法。一种是差分+二分。通过二分 queries 寻找能满足题目要求的最小 k。另一种是双指针,和解题思路差不多。


你可能感兴趣的:(LeetCode,刷题,LeetCode)