↓快轉到主要內容
  1. LeetCode/

LeetCode 992: Subarrays with K Different Integers

·1 分鐘· ·
LeetCode Hard Sliding-Window Hash-Table Counting Array
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: hard 第一次嘗試:2026-01-21

  • 提交紀錄:Accepted(一次通過)

解題思路
#

「剛好 k 種」不單調,「最多 k 種」是單調的:

剛好 k 種 = 最多 k 種 − 最多 k - 1 種

「最多」型的計數:種類超過上限就縮左邊,以 right 結尾的合法子陣列有 right - left + 1 個。

我的解法
#

我 AC 的寫法用了跟 LeetCode 3306 一樣的 extra 技巧:剛好 k 種時,把左邊多餘的重複值縮掉並記在 extra,每個右端加 1 + extra;種類超過 k 被迫縮掉一種時 extra 歸零。這裡寫成比較通用的「最多」相減:

class Solution:
    def subarraysWithKDistinct(self, nums: List[int], k: int) -> int:
        def at_most(limit: int) -> int:
            cnt = Counter()
            left = count = 0
            for right, x in enumerate(nums):
                cnt[x] += 1
                while len(cnt) > limit:
                    y = nums[left]
                    cnt[y] -= 1
                    if cnt[y] == 0:
                        del cnt[y]
                    left += 1
                count += right - left + 1
            return count

        return at_most(k) - at_most(k - 1)

複雜度
#

時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • 計數歸零時要刪 key,len(cnt) 才是種類數。

面試口說整理
#

「剛好 k 種」不單調,所以我算「最多 k 種」減「最多 k - 1 種」。「最多」型用滑動視窗,種類超過上限就縮左邊,以右端結尾的合法子陣列有 right - left + 1 個。兩次都是 O(n)。

相關文章

LeetCode 2009: Minimum Number of Operations to Make Array Continuous
·1 分鐘
LeetCode Hard Sliding-Window Hash-Table Binary-Search Array
LeetCode 2009 解題筆記:最後的陣列是長度 n 的連續整數;去重排序後,用滑動視窗找值域寬度 <= n - 1 的最多不同值,其他都要改
LeetCode 3679: Minimum Discards to Balance Inventory
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Simulation Counting Array
LeetCode 3679 解題筆記:規則已經決定哪些要丟,直接模擬;長度 w 的視窗只計算「留下來」的到貨,被丟掉的離開視窗時不能再扣
LeetCode 3298: Count Substrings That Can Be Rearranged to Contain a String II
·1 分鐘
LeetCode Hard Sliding-Window Hash-Table String
LeetCode 3298 解題筆記:能重排成以 word2 開頭 ⇔ 每個字元的數量都不少於 word2;「至少」型的計數視窗,用 meet 記錄有幾種字元已經達標
LeetCode 930: Binary Subarrays With Sum
·1 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table Array
LeetCode 930 解題筆記:「和剛好是 goal」= 「和最多 goal」−「和最多 goal - 1」;或用前綴和 + 雜湊表
LeetCode 2302: Count Subarrays With Score Less Than K
·1 分鐘
LeetCode Hard Sliding-Window Prefix-Sum Binary-Search Array
LeetCode 2302 解題筆記:分數 = 總和 × 長度,都是正數,視窗越大分數越大;分數 >= k 就縮左邊,以 right 結尾的合法子陣列有 right - left + 1 個
LeetCode 2968: Apply Operations to Maximize Frequency Score
·1 分鐘
LeetCode Hard Sliding-Window Sorting Prefix-Sum Binary-Search Array
LeetCode 2968 解題筆記:排序後,把一段全部變成同一個值,最省的目標是中位數;用前綴和 O(1) 算花費,花費隨視窗變大而變大,可以滑動