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

LeetCode 1493: Longest Subarray of 1's After Deleting One Element

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

基本資料
#

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

  • 提交紀錄:Accepted ×2

解題思路
#

刪掉一個元素後全是 1 的子陣列,原本就是「最多含一個 0」的子陣列,刪掉的就是那個 0(沒有 0 的話隨便刪一個 1)。

所以找最多一個 0 的最長視窗,答案是視窗長度 − 1:

  • 右邊界加入元素,0 的數量超過 1 就縮左邊界。
  • 更新 right - left(也就是長度減 1)。

全是 1 的時候也一定要刪一個,答案是 n - 1,這個寫法自然涵蓋。

我的解法
#

class Solution:
    def longestSubarray(self, nums: List[int]) -> int:
        left = zeros = best = 0
        for right, x in enumerate(nums):
            zeros += x == 0
            while zeros > 1:
                zeros -= nums[left] == 0
                left += 1
            best = max(best, right - left)         # 視窗長度 - 1
        return best

兩次 AC 的寫法差不多,第二次把 while 條件寫得比較乾淨(第一次多了一個 nums[right] == 0 的判斷)。

複雜度
#

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

要特別避免的錯誤
#

  • 回傳視窗長度而不是長度減 1:題目規定一定要刪一個。
  • 全是 1 時答案是 n - 1,不是 n。

面試口說整理
#

刪掉一個元素後全是 1,代表原本的子陣列最多只有一個 0。我用滑動視窗找最多一個 0 的最長視窗,0 超過一個就縮左邊。因為一定要刪一個元素,答案是視窗長度減 1,全是 1 時也成立。時間 O(n)。

相關文章

LeetCode 3638: Maximum Balanced Shipments
·1 分鐘
LeetCode Medium Dynamic-Programming Greedy Monotonic-Stack Array
LeetCode 3638 解題筆記:貪心,一段一旦出現比這段最大值小的數就馬上切;因為切之前的那段是非遞減的,最大值就是前一個數
LeetCode 1248: Count Number of Nice Subarrays
·2 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table Array
LeetCode 1248 解題筆記:「剛好 k 個奇數」不單調,改成「最多 k 個」減「最多 k - 1 個」;或用前綴和 + 雜湊表
LeetCode 313: Super Ugly Number
·1 分鐘
LeetCode Medium Array Math Dynamic-Programming
LeetCode 313 解題筆記:LC 264 的推廣,每個質數一個指針;用 heap 的話要避免同一個數被推進去很多次
LeetCode 396: Rotate Function
·1 分鐘
LeetCode Medium Array Math Dynamic-Programming
LeetCode 396 解題筆記:F(k) 和 F(k - 1) 只差一個公式:F(k) = F(k - 1) + sum - n × 被移到最前面的那個數
LeetCode 435: Non-overlapping Intervals
·1 分鐘
LeetCode Medium Array Dynamic-Programming Greedy Sorting
LeetCode 435 解題筆記:最少刪幾個 = 總數減掉最多能保留幾個;按右端點排序,貪心保留結束最早的
LeetCode 473: Matchsticks to Square
·1 分鐘
LeetCode Medium Array Dynamic-Programming Backtracking Bit-Manipulation
LeetCode 473 解題筆記:總和要能被 4 整除;由大到小把每根火柴放進四個邊之一,超過邊長或跟前一個邊長度相同就跳過