1. 程式人生 > 其它 >992. K 個不同整數的子陣列

992. K 個不同整數的子陣列

技術標籤: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

在這裡插入圖片描述