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

LeetCode 2831: Find the Longest Equal Subarray

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

基本資料
#

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

  • 提交紀錄:Wrong Answer → Time Limit Exceeded ×2 → Accepted

解題思路
#

最後留下來的是同一個值 v。分別對每個值處理:

  • 列出 v 出現的位置 pos = [p0, p1, ...]。
  • 如果要保留 pos[l..r] 這幾個 v,它們之間的其他元素都要刪掉:要刪的數量是 (pos[r] - pos[l] + 1) - (r - l + 1)。
  • 在 pos 上用滑動視窗:要刪的超過 k 就縮左邊,答案是 r - l + 1 的最大值。

所有值的位置列表加起來長度是 n,總共 O(n)。

我的嘗試
#

版本問題
第一版 WA在原陣列上滑動,用 長度 - 出現最多次的數 > k 判斷,最後回傳 最長視窗 - k。但視窗裡不一定剛好刪了 k 個。例如 nums = [2]、k = 2:答案是 1,這版回傳 1 - 2 = -1
第二、三版 TLE改成回傳 max(freq.values()),邏輯對了,但每一步都對整個計數表取 max,O(n · 不同值的數量)
AC改成對每個值的位置列表各自滑動

正確解法
#

class Solution:
    def longestEqualSubarray(self, nums: List[int], k: int) -> int:
        positions = defaultdict(list)
        for i, v in enumerate(nums):
            positions[v].append(i)

        best = 0
        for pos in positions.values():
            left = 0
            for right in range(len(pos)):
                while (pos[right] - pos[left] + 1) - (right - left + 1) > k:
                    left += 1                      # 中間要刪的太多
                best = max(best, right - left + 1)
        return best

複雜度
#

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

要特別避免的錯誤
#

  • 用 視窗長度 - k 當答案:視窗裡實際刪掉的數量不一定是 k。
  • 每一步都對計數表取 max:O(n · distinct)。

面試口說整理
#

最後留下的是同一個值,所以我對每個值分開處理:列出它出現的位置,保留其中連續幾個時,要刪的是位置跨度減掉個數。在位置列表上用滑動視窗,要刪的超過 k 就縮左邊,視窗裡的個數就是候選答案。所有列表加起來長度是 n,時間 O(n)。

相關文章

LeetCode 2779: Maximum Beauty of an Array After Applying Operation
·1 分鐘
LeetCode Medium Sliding-Window Sorting Binary-Search Array
LeetCode 2779 解題筆記:每個數可以變成 [x - k, x + k] 裡的任何值,一群數能變成同一個值 ⇔ 最大 - 最小 <= 2k;排序後找最長的這種視窗
LeetCode 3795: Minimum Subarray Length With Distinct Sum At Least K
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Array
LeetCode 3795 解題筆記:求最短的可變視窗;同一個值只算一次,記錄每個值最後出現的位置,左邊界移出的是最後一次出現才扣掉
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 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 就縮左邊