滑动窗口+前缀和-7--LC992.K个不同整数的子数组

在这里插入图片描述

class Solution(object):
    def subarraysWithKDistinct(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: int
        """
        # 904题的进阶,904是寻找最长,这里限定了种类个数k
        # 这里涉及到状态回缩
        # endfor循环里自动更新,end每次只能在当前位置或者当前位置之后,不能回缩
        # 此题出现了恰好等于的情况,k,就需要回缩了,start往后,end往前可以出现一个新的窗口,这个新的窗口我们也需要考虑
        # 种类为k,前缀和的思路
        # 904<=2用不回缩的方式写,这里等于k也可以用不回缩的方式写,用904不回缩的方式写,然后<=2 - <=1就可以得到=2的
        def leK(nums, k):
            start = 0
            # 种类的时候放到字典,哈希表中存储
            adict = {}
            count = 0
            for end in range(len(nums)):
                if nums[end] not in adict:
                    adict[nums[end]] = 1
                else:
                    adict[nums[end]] += 1
                while len(adict) > k:
                    adict[nums[start]] -= 1
                    if adict[nums[start]] == 0:
                        del adict[nums[start]]
                    start += 1
                # 这里的count有讲究
                count += end-start+1
            return count
        return leK(nums, k) - leK(nums, k-1)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值