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

LeetCode 2461: Maximum Sum of Distinct Subarrays With Length K

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

基本資料
#

難易度: medium 第一次嘗試:2025-12-24

  • 提交紀錄:Accepted ×2

解題思路
#

跟 LeetCode 2841 同一個模板:固定長度 k 的視窗,維護總和與計數雜湊表。不同值的個數等於 k,代表視窗裡沒有重複。

另一種寫法(我兩次 AC 用的)是可變視窗:遇到重複的值,或視窗超過 k,就縮左邊;視窗長度剛好 k 時更新答案。

我的解法
#

class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        cnt = Counter()
        window = best = 0
        for right, x in enumerate(nums):
            cnt[x] += 1
            window += x
            if right >= k:
                out = nums[right - k]
                cnt[out] -= 1
                window -= out
                if cnt[out] == 0:
                    del cnt[out]
            if right >= k - 1 and len(cnt) == k:   # k 個值全部不同
                best = max(best, window)
        return best

我的第二次 AC 用 set 搭配可變視窗(這裡稍微整理過順序):

class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        seen = set()
        left = window = best = 0
        for right, x in enumerate(nums):
            while x in seen or right - left >= k:
                seen.remove(nums[left])
                window -= nums[left]
                left += 1
            seen.add(x)
            window += x
            if right - left + 1 == k:
                best = max(best, window)
        return best

複雜度
#

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

要特別避免的錯誤
#

  • 固定視窗時用 len(cnt) >= k:長度 k 的視窗最多只有 k 種,要剛好等於 k。
  • 可變視窗時,要先縮完再把新元素加進 set。

面試口說整理
#

這是固定長度 k 的滑動視窗,維護總和和計數雜湊表,數量歸零就刪 key。雜湊表大小剛好等於 k 代表視窗裡全部不同,這時更新最大總和。也可以用 set 加可變視窗:遇到重複或超過 k 就縮左邊。時間 O(n)。

相關文章

LeetCode 3679: Minimum Discards to Balance Inventory
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Simulation Counting Array
LeetCode 3679 解題筆記:規則已經決定哪些要丟,直接模擬;長度 w 的視窗只計算「留下來」的到貨,被丟掉的離開視窗時不能再扣
LeetCode 2841: Maximum Sum of Almost Unique Subarray
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Array
LeetCode 2841 解題筆記:固定長度 k 的視窗,維護總和與計數雜湊表;不同值的個數就是雜湊表的大小,數量歸零要刪 key
LeetCode 1248: Count Number of Nice Subarrays
·2 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table Array
LeetCode 1248 解題筆記:「剛好 k 個奇數」不單調,改成「最多 k 個」減「最多 k - 1 個」;或用前綴和 + 雜湊表
LeetCode 1423: Maximum Points You Can Obtain from Cards
·1 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Array
LeetCode 1423 解題筆記:從兩端拿 k 張,等於中間留下連續 n - k 張;用固定長度視窗找留下來的最小和
LeetCode 1493: Longest Subarray of 1's After Deleting One Element
·1 分鐘
LeetCode Medium Sliding-Window Dynamic-Programming Array
LeetCode 1493 解題筆記:找「最多 1 個 0」的最長視窗,因為一定要刪一個元素,答案是視窗長度減 1
LeetCode 594: Longest Harmonious Subsequence
·1 分鐘
LeetCode Easy Array Hash-Table Sliding-Window Sorting
LeetCode 594 解題筆記:子序列不用連續,所以只要計數,每個 x 看 x 和 x + 1 的次數加起來