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

LeetCode 2401: Longest Nice Subarray

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

基本資料
#

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

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

解題思路
#

視窗裡任兩個數 AND 都是 0 ⇔ 每個 bit 最多只被一個數使用。所以用一個整數 used 記錄視窗裡所有數的 OR:

  • 新的數 x 跟 used 有重疊(used & x != 0),就縮左邊,直到沒有重疊。
  • 移出 nums[left] 時,它的 bit 一定只屬於它自己,用 used ^= nums[left](或 &= ~)拿掉。
  • 加入 x:used |= x。

數字最多 30 個 bit,所以合法的視窗最長只有 30。

我的解法
#

class Solution:
    def longestNiceSubarray(self, nums: List[int]) -> int:
        used = left = best = 0
        for right, x in enumerate(nums):
            while used & x:                        # 有 bit 衝突
                used ^= nums[left]                 # 它的 bit 只屬於它,XOR 就能拿掉
                left += 1
            used |= x
            best = max(best, right - left + 1)
        return best

複雜度
#

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

要特別避免的錯誤
#

  • 用 -= 或 ^= 拿掉 bit 之所以正確,是因為視窗裡的 bit 互不重疊;如果重疊就不能這樣做。

面試口說整理
#

兩兩 AND 為 0,代表每個 bit 最多被一個數用到,所以我用一個整數記錄視窗用掉的 bit。新的數跟它有重疊就縮左邊,移出的數 bit 只屬於它自己,XOR 就能拿掉。記錄最長長度,時間 O(n)。

相關文章

LeetCode 930: Binary Subarrays With Sum
·1 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table Array
LeetCode 930 解題筆記:「和剛好是 goal」= 「和最多 goal」−「和最多 goal - 1」;或用前綴和 + 雜湊表
LeetCode 2962: Count Subarrays Where Max Element Appears at Least K Times
·1 分鐘
LeetCode Medium Sliding-Window Array
LeetCode 2962 解題筆記:「至少 k 次」的計數視窗:最大值出現 k 次時一直縮左邊,縮完後左端在 [0, left) 的子陣列都合法,count += left
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 解題筆記:地毯的左端放在某段白磚的起點一定不會更差;排序後用雙指針,完整蓋住的段累加,最後一段只算部分