Medium草稿★★★★★O(n) 時間 · O(1) 空間
GreedyDynamic Programming
Patterns🪙 貪心
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

55Jump GameGreedyMediumGreedy

給定一個非負整數陣列 nums,每個元素代表在該位置最多能跳的步數。從第一個位置出發,判斷能否到達最後一個位置。

Example:

Input: nums = [2,3,1,1,4] Output: true

Intuition

TIP

維護「能到達的最遠位置」,遍歷時若當前位置超過最遠位置則無法到達。

Approaches

1. DP (bottom-up) — O(n^2) / O(n)
  • Idea: dp[i] 記錄位置 i 是否可達,對每個可達位置更新它能跳到的所有位置。
  • Time: O(n^2) 最差情況
  • Space: O(n)
class Solution {
    fun canJump(nums: IntArray): Boolean {
        val n = nums.size
        val dp = BooleanArray(n)
        dp[0] = true
        for (i in 1 until n) {
            for (j in i - 1 downTo 0) {
                if (dp[j] && j + nums[j] >= i) {
                    dp[i] = true
                    break
                }
            }
        }
        return dp[n - 1]
    }
}
⭐ 2. Greedy (farthest reach) — O(n) / O(1)
  • Idea: 維護一個變數 maxReach 記錄目前能到達的最遠位置,線性掃描即可。
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun canJump(nums: IntArray): Boolean {
        var maxReach = 0
        for (i in nums.indices) {
            if (i > maxReach) return false
            maxReach = maxOf(maxReach, i + nums[i])
        }
        return true
    }
}

🔑 Takeaways