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

LeetCode 3660: Jump Game IX

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

基本資料
#

難易度: medium 第一次嘗試:2026-06-23

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

解題思路
#

可以往右跳到比較小的數、往左跳到比較大的數。

在 i 和 i + 1 之間切開,看左邊 [0..i] 的最大值 pre_max[i] 和右邊 [i+1..] 的最小值 suf_min:

  • pre_max[i] > suf_min:左邊最大的那個可以往右跳到右邊最小的那個,右邊最小的那個可以往左跳回任何比它大的。左右兩邊連成一塊,所以 ans[i] = ans[i + 1]。
  • pre_max[i] <= suf_min:左邊每個數都 <= 右邊每個數,從左邊永遠跳不到右邊(往右只能跳到更小的)。左邊自己內部都能跳到 pre_max[i](往左跳到較大的,或往右跳再往左),所以 ans[i] = pre_max[i]。

從右往左算,ans[n - 1] = pre_max[n - 1](整個陣列的最大值)。

我的解法
#

class Solution:
    def maxValue(self, nums: List[int]) -> List[int]:
        n = len(nums)
        pre_max = list(accumulate(nums, max))
        ans = [0] * n
        suf_min = float("inf")
        for i in range(n - 1, -1, -1):
            if pre_max[i] > suf_min:
                ans[i] = ans[i + 1]                # 跟右邊連成一塊
            else:
                ans[i] = pre_max[i]                # 跳不過去,只能拿左邊的最大值
            suf_min = min(suf_min, nums[i])
        return ans

複雜度
#

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

要特別避免的錯誤
#

  • 用 BFS / DFS 對每個起點搜尋:O(n^2)。
  • 切點的條件是嚴格的 >:相等的數之間不能跳。

面試口說整理
#

我在每個位置切一刀,看左邊的最大值和右邊的最小值。左邊最大大於右邊最小,兩邊就能互相跳到,左邊的答案跟右邊一樣;否則左邊永遠跳不過去,答案就是左邊的最大值。前綴最大值先算好,從右往左維護後綴最小值,時間 O(n)。

相關文章

LeetCode 3840: House Robber V
·1 分鐘
LeetCode Medium Dynamic-Programming Array
LeetCode 3840 解題筆記:只有相鄰而且同色才衝突;顏色不同直接拿,同色時才做打家劫舍的取捨
LeetCode 1493: Longest Subarray of 1's After Deleting One Element
·1 分鐘
LeetCode Medium Sliding-Window Dynamic-Programming Array
LeetCode 1493 解題筆記:找「最多 1 個 0」的最長視窗,因為一定要刪一個元素,答案是視窗長度減 1
LeetCode 3638: Maximum Balanced Shipments
·1 分鐘
LeetCode Medium Dynamic-Programming Greedy Monotonic-Stack Array
LeetCode 3638 解題筆記:貪心,一段一旦出現比這段最大值小的數就馬上切;因為切之前的那段是非遞減的,最大值就是前一個數
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 解題筆記:最少刪幾個 = 總數減掉最多能保留幾個;按右端點排序,貪心保留結束最早的