[Python][LeetCode][1695. 删除子数组的最大得分]


 

class Solution:
    def maximumUniqueSubarray(self, nums: List[int]) -> int:
        '''
        求一个连续的子数组,该子数组满足以下三个条件:
        1,子数组中的所有元素都不同
        2,子数组的和最大
        3,子数组是连续的
        '''
        maxSum = -math.inf
        windowSum = 0
        hashMap = {}
        start = 0
        for end in range(len(nums)):
            windowSum = windowSum + nums[end]
            hashMap[nums[end]] = hashMap.get(nums[end],0) + 1
            if end - start + 1 == len(hashMap):
                maxSum = max(maxSum,windowSum)
            while end - start + 1 > len(hashMap):
                head = nums[start]
                hashMap[head] = hashMap[head] - 1
                if hashMap[head] == 0:
                    del hashMap[head]
                windowSum = windowSum - head
                start = start + 1
        return maxSum

题目:

力扣

知识点:

滑动窗口

这道题目结合了 3. 无重复字符的最长子串 和 643. 子数组最大平均数 I

细节问题 / 提交出错点:

No.1

描述:滑动窗口首指针移动的契机

出错原因:

原错误写法:if end - start + 1 > len(hashMap):

修改后写法:while end - start + 1 > len(hashMap):

当滑动窗口内出现重复数据时,重复的数据并不一定总是首指针指向的数据。要使用while循环,清理滑动窗口中的数据,直到使得滑动窗口满足【子数组数据不重复的要求】

No.2

描述:求最大值的契机

出错原因:

原错误写法:

if hashMap[head] == 0:
                    del hashMap[head]

                maxSum = max(maxSum,windowSum)
                windowSum = windowSum - head

修改后写法:

if hashMap[head] == 0:
                    del hashMap[head]
                windowSum = windowSum - head

在清理滑动窗口的过程中是不该更新子数组的最大和的,因为在该过程中,滑动窗口对应的数组是不满足子数组的3个求和条件的。

参考资料:

题解:力扣

这个滑动窗口的题解堪称神作!本人要沐浴焚香虔诚诵读100遍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值