992. K 個不同整數的子陣列
阿新 • • 發佈:2021-02-10
技術標籤:Python
給定一個正整數陣列 A,如果 A 的某個子陣列中不同整數的個數恰好為 K,則稱 A 的這個連續、不一定獨立的子陣列為好子陣列。
(例如,[1,2,3,1,2] 中有 3 個不同的整數:1,2,以及 3。)
返回 A 中好子陣列的數目。
示例 1:
輸入:A = [1,2,1,2,3], K = 2
輸出:7
解釋:恰好由 2 個不同整陣列成的子陣列:[1,2], [2,1], [1,2], [2,3], [1,2,1], [2,1,2], [1,2,1,2].
示例 2:
輸入:A = [1,2,1,3,4], K = 3
輸出:3
解釋:恰好由 3 個不同整陣列成的子陣列:[1,2,1,3], [2,1,3], [1,3,4].
提示:
1 <= A.length <= 20000
1 <= A[i] <= A.length
1 <= K <= A.length
思路
雙指標(滑動視窗)
本質上是在列舉符合條件的右端點
class Solution:
def subarraysWithKDistinct(self, A: List[int], K: int) -> int:
n = len(A)
counter = collections.defaultdict(lambda: 0)
ans = 0
left, right = 0, 0
while right < n:
counter[A[right]] += 1
right += 1
while len(counter.keys()) > K:
counter[A[left]] -= 1
if counter[A[left]] == 0:
counter.pop(A[left])
left += 1
if len (counter.keys()) == K:
l = left
tmp_cnt = counter.copy()
while len(tmp_cnt.keys()) == K:
# print(A[l:right])
tmp_cnt[A[l]] -= 1
if tmp_cnt[A[l]] == 0:
tmp_cnt.pop(A[l])
l += 1
ans += 1
return ans