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

LeetCode 2962: Count Subarrays Where Max Element Appears at Least K Times

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

基本資料
#

難易度: medium 第一次嘗試:2026-01-19

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

解題思路
#

最大值 mx 是整個陣列的最大值,固定不變。視窗裡 mx 出現的次數越多越好,「至少 k 次」是單調的:視窗合法,往左延伸也一定合法。

「至少 K」的計數寫法:

  • 右端加入,mx 出現 k 次時一直縮左邊,縮到剛好不到 k 次。
  • 這時左端放在 [0, left) 的任何位置,子陣列都至少有 k 個 mx,所以 count += left。

我的解法
#

class Solution:
    def countSubarrays(self, nums: List[int], k: int) -> int:
        mx = max(nums)
        left = seen = count = 0
        for x in nums:
            seen += x == mx
            while seen >= k:                       # 合法就縮,縮到剛好不合法
                seen -= nums[left] == mx
                left += 1
            count += left                          # 左端在 [0, left) 都合法
        return count

複雜度
#

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

要特別避免的錯誤
#

  • 用 right - left + 1:那是「最多」型的計數,這題是「至少」。
  • 最大值是整個陣列的最大值,不是視窗的。

面試口說整理
#

最大值固定是整個陣列的最大值,出現至少 k 次是單調的。我用滑動視窗,最大值出現 k 次時就一直縮左邊,縮到剛好不夠為止,這時左端在 0 到 left - 1 的子陣列都合法,所以加上 left。時間 O(n)。

相關文章

LeetCode 1040: Moving Stones Until Consecutive II
·1 分鐘
LeetCode Medium Sliding-Window Math Sorting Array
LeetCode 1040 解題筆記:最多步數 = 總空位 − 第一步會浪費掉的那一邊空隙;最少步數用長度 n 的視窗找最多石頭,n - 1 顆已連續、剩一顆在遠處時要特判成 2
LeetCode 2555: Maximize Win From Two Segments
·1 分鐘
LeetCode Medium Sliding-Window Binary-Search Array
LeetCode 2555 解題筆記:滑動視窗算出以每個獎品結尾的一段能拿幾個;同時記錄「前 i 個獎品裡一段最多拿幾個」,第二段就接在第一段左邊
LeetCode 1838: Frequency of the Most Frequent Element
·1 分鐘
LeetCode Medium Sliding-Window Sorting Greedy Prefix-Sum Binary-Search Array
LeetCode 1838 解題筆記:排序後,把視窗裡的數都加到 nums[right] 的花費是 nums[right] × 長度 − 視窗總和;花費 > k 就縮左邊
LeetCode 2271: Maximum White Tiles Covered by a Carpet
·1 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 2271 解題筆記:地毯的左端放在某段白磚的起點一定不會更差;排序後用雙指針,完整蓋住的段累加,最後一段只算部分
LeetCode 2958: Length of Longest Subarray With at Most K Frequency
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Array
LeetCode 2958 解題筆記:「求最長」的滑動視窗,剛加入的數字出現超過 k 次就縮左邊
LeetCode 3634: Minimum Removals to Balance Array
·1 分鐘
LeetCode Medium Sliding-Window Sorting Binary-Search Array
LeetCode 3634 解題筆記:排序後留下來的一定是連續一段;對每個最小值 nums[left],用只往右走的指針找能留到哪裡,刪掉兩邊剩下的