Leetcode 992

问题描述

给予一个数组和一个 K 值。找到该数组下所有的 存在着 K 个不同字符的子数组个数。
在这里插入图片描述

思路
  • 设立三个指针 i, j, k
  • 当前循环次数为 i:
    • A[i]-A[j] 表示以第 i 个数开始,子数组 A[i:j] 表示不同值为 K 时的最小子数组。
    • A[i]-A[k] 表示以第 i 个数开始,子数组 A[i:k] 表示不同值为 K+1 时的最小子数组。
    • 从 i 到 j 的符合条件的子数组为 k-j+1
    • 如下:
      在这里插入图片描述
class Solution(object):
    def subarraysWithKDistinct(self, A, K):
        """
        :type A: List[int]
        :type K: int
        :rtype: int
        """
        right,end_k = 0,0
 
        N = len(A)
        # 存取数字个数
        count = 0
        window={}
        for i in range(len(A)):
            # 以 i 开头找window
            right = max(right,i)
            while(right< N and len(window)< K):
                    window[A[right]] = window.get(A[right],0)+1
                    right +=1
            
            if len(window)<K:
                break
            # 找 end_k
            end_k = right
            while(end_k< N):
                if window.get(A[end_k],0)==0:
                    break
                end_k+=1
                
            count += end_k-right+1
            
            window[A[i]] -= 1
            if  window[A[i]] ==0:
                 window.pop(A[i])
        return count
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值