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

LeetCode 2653: Sliding Subarray Beauty

·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 第一次嘗試:2026-01-03

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

解題思路
#

每個長度 k 的視窗要找第 x 小的數,如果它是負數就回傳它,否則回傳 0。

一般的「視窗第 x 小」需要有序結構,但這題值域只有 -50..50,用長度 101 的計數陣列就夠了:

  • 視窗移動時,進來的 +1、出去的 -1。
  • 每個視窗從 -50 往上累加負數的個數,累計到 x 時的值就是答案;負數不到 x 個就是 0。

每個視窗最多看 50 個格子,總共 O(50n)。

我的解法
#

class Solution:
    def getSubarrayBeauty(self, nums: List[int], k: int, x: int) -> List[int]:
        cnt = [0] * 101                            # 值 v 存在 cnt[v + 50]
        res = []
        for right, v in enumerate(nums):
            cnt[v + 50] += 1
            if right >= k:
                cnt[nums[right - k] + 50] -= 1
            if right >= k - 1:
                seen = 0
                for idx in range(50):              # 只看負數 -50..-1
                    seen += cnt[idx]
                    if seen >= x:
                        res.append(idx - 50)
                        break
                else:
                    res.append(0)
        return res

我原本的寫法用長度 50 的陣列,直接拿負數 v 當 index(neg_array[v]),利用 Python 的負 index 從尾巴數回來,-50 會對到 index 0,所以掃到 index i 時的值是 i - 50。能跑但不好讀,這裡改成明確的位移 + 50。

複雜度
#

時間 O(n · 50),空間 O(1)(101 格)。

要特別避免的錯誤
#

  • 每個視窗都排序:O(n · k log k)。
  • 負數不到 x 個時要回傳 0。

面試口說整理
#

值域只有 -50 到 50,所以我用計數陣列維護固定長度的視窗,進來加一、出去減一。每個視窗從 -50 往上累加負數的數量,加到 x 時就是第 x 小的負數,不夠就回傳 0。每個視窗最多看 50 格,總共 O(50n)。

相關文章

LeetCode 3795: Minimum Subarray Length With Distinct Sum At Least K
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Array
LeetCode 3795 解題筆記:求最短的可變視窗;同一個值只算一次,記錄每個值最後出現的位置,左邊界移出的是最後一次出現才扣掉
LeetCode 2461: Maximum Sum of Distinct Subarrays With Length K
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Array
LeetCode 2461 解題筆記:固定長度 k 的視窗,不同值的個數剛好等於 k 才代表全部不重複
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 2134: Minimum Swaps to Group All 1's Together II
·1 分鐘
LeetCode Medium Sliding-Window Array
LeetCode 2134 解題筆記:所有 1 最後會佔一段長度為 1 的個數的環狀視窗,要交換的次數就是視窗裡 0 的數量;在環上滑動找最小值