LeetCode 2461. 長度為 K 子陣列中的最大和(滑動視窗圖解)
2461. 長度為 K 子陣列中的最大和
題目描述
給你一個整數陣列 nums 和一個整數 k。請你從 nums 中滿足下述條件的全部子陣列中找出最大子陣列和:
- 子陣列的長度是
k,且 - 子陣列中的所有元素各不相同。
回傳滿足題面要求的最大子陣列和。如果不存在子陣列滿足這些條件,回傳 0。
子陣列是陣列中一段連續非空的元素序列。
範例 1
1 | |
範例 2
1 | |
限制
1 <= k <= nums.length <= 10^51 <= nums[i] <= 10^5
本文題解思路與程式碼整理自 LeetCode 題解作者「灵茶山艾府」,題解連結。圖解為自行補充。
前置知識:滑動視窗與出現次數表
這題和上一篇 LeetCode 2841 幾乎一模一樣,沒看過的話建議先讀那篇。
重點回顧:定長視窗每次右移一格,少一個最左元素、多一個新元素。要統計視窗內有幾種不同元素,需要用雜湊表記錄每個元素的出現次數;元素離開視窗時次數減一,減到 0 才從表中刪除。
思路
「長度為 k 且元素各不相同」等價於:
視窗內不同元素的個數
cnt.size()恰好等於k。
因為視窗只有 k 個元素,不同元素個數最多就是 k,等於 k 就代表沒有任何重複。所以只要把 2841 的條件 >= m 改成 == k 即可:
- 入:
x = nums[i]進入視窗,s += x,cnt[x]++。若i < k - 1視窗還沒滿,繼續。 - 更新:若
cnt.size() == k,用s更新答案的最大值。 - 出:
x = nums[i - k + 1]離開視窗,s -= x,cnt[x]--。若減完是 0,要把x從雜湊表刪除,否則cnt.size()會算錯。
圖解(可互動)
使用範例 1:nums = [1,5,4,2,9,9,9],k = 3。注意視窗 [2,9,9] 時 9 的次數是 2,不同元素只有 2 個,小於 k,所以不計入答案。
nums = [1,5,4,2,9,9,9],k = 3
視窗內
入 = 新進入
出 = 剛離開
視窗總和 s0
不同元素 cnt.size()0
目前最大值 ans0
解法(灵茶山艾府)
1 | |
s用long:k最大 10^5、元素最大 10^5,總和最大 10^10,超過int。- 離開視窗時次數歸零一定要
remove,這是最容易出錯的地方。
複雜度分析
- 時間複雜度:O(n),其中 n 是
nums的長度,每個元素進出視窗各一次。 - 空間複雜度:O(k),雜湊表大小不會超過視窗長度 k。
LeetCode 2461. 長度為 K 子陣列中的最大和(滑動視窗圖解)
https://shengshengyang.github.io/2026/10/19/leetcode-2461-max-sum-distinct-subarrays-k/