问题描述
给予一个数组和一个 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