'''
Description:
Autor: Au3C2
Date: 2021-02-09 13:27:41
LastEditors: Au3C2
LastEditTime: 2021-02-16 12:12:50
'''
class Solution:
def subarraysWithKDistinct(self, A: List[int], K: int) -> int:
n = len(A)
num1, num2 = collections.Counter(), collections.Counter()
tot1 = tot2 = 0
left1 = left2 = right = 0
ret = 0
for right, num in enumerate(A):
if num1[num] == 0:
tot1 += 1
num1[num] += 1
if num2[num] == 0:
tot2 += 1
num2[num] += 1
while tot1 > K:
num1[A[left1]] -= 1
if num1[A[left1]] == 0:
tot1 -= 1
left1 += 1
while tot2 > K - 1:
num2[A[left2]] -= 1
if num2[A[left2]] == 0:
tot2 -= 1
left2 += 1
ret += left2 - left1
return ret
# 哈希表,困难,每日一题
# https://leetcode-cn.com/problems/subarrays-with-k-different-integers/