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

LeetCode 2555: Maximize Win From Two Segments

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

基本資料
#

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

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

解題思路
#

兩段重疊不會比不重疊好,所以可以假設兩段一左一右、不重疊。

  1. 用滑動視窗:右端是第 right 個獎品,左端 left 是第一個位置 >= prizePositions[right] - k 的獎品,這一段拿 right - left + 1 個。
  2. 第二段必須完全在 left 左邊,也就是只能用前 left 個獎品。預先記錄 best_before[i] = 只用前 i 個獎品時,一段最多拿幾個。
  3. 答案是 max(right - left + 1 + best_before[left])。

best_before 在滑動的過程中順便更新:best_before[right + 1] = max(best_before[right], 這一段)。

我的解法
#

class Solution:
    def maximizeWin(self, prizePositions: List[int], k: int) -> int:
        n = len(prizePositions)
        best_before = [0] * (n + 1)                # 只用前 i 個獎品,一段最多拿幾個
        left = ans = 0
        for right, p in enumerate(prizePositions):
            while p - prizePositions[left] > k:
                left += 1
            cur = right - left + 1
            ans = max(ans, cur + best_before[left])     # 第二段在 left 左邊
            best_before[right + 1] = max(best_before[right], cur)
        return ans

複雜度
#

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

要特別避免的錯誤
#

  • 兩段分別取最大值相加:兩段可能重複拿同一批獎品。
  • best_before[left] 是「前 left 個」,不包含 left 本身,所以不會跟目前這段重疊。

面試口說整理
#

兩段可以假設一左一右不重疊。我用滑動視窗算以每個獎品結尾的一段能拿幾個,同時用陣列記錄只用前 i 個獎品時一段最多拿幾個。目前這段從 left 開始,另一段只能在 left 左邊,所以答案是這段加上 best_before[left] 的最大值。時間 O(n)。

相關文章

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 3634: Minimum Removals to Balance Array
·1 分鐘
LeetCode Medium Sliding-Window Sorting Binary-Search Array
LeetCode 3634 解題筆記:排序後留下來的一定是連續一段;對每個最小值 nums[left],用只往右走的指針找能留到哪裡,刪掉兩邊剩下的
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 2831: Find the Longest Equal Subarray
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Binary-Search Array
LeetCode 2831 解題筆記:對每個值,把它出現的位置列出來;在位置列表上滑動視窗,要刪的數量 = 位置跨度 − 這個值的個數
LeetCode 209: Minimum Size Subarray Sum
·1 分鐘
LeetCode Daily Medium Array Sliding-Window Two-Pointers Prefix-Sum Binary-Search
滑動視窗與雙指針,最小化子陣列長度(總和 ≥ target)。