LeetCode - Jump Game(跳躍遊戲)
題目描述
給定一個由非負整數組成的數組 nums,其中 nums[i] 表示在位置 i 可以跳躍的最遠距離。你的目標是判斷是否可以從數組的起始位置跳到最後一個位置。如果可以到達,返回 True;否則,返回 False。
範例:
1
2
3
輸入:nums = [2,3,1,1,4]
輸出:True
解釋:從位置 0 開始跳 1 步到達位置 1,然後跳 3 步到達最後位置。
1
2
3
輸入:nums = [3,2,1,0,4]
輸出:False
解釋:無論如何都無法跳到最後一個位置。
解法思路
我們可以使用貪心算法來解決這個問題,即不斷更新能夠跳躍到的最遠位置。具體步驟如下:
初始化最遠可達位置:設置變量
max_reachable表示當前能跳到的最遠位置,初始化為 0。- 遍歷陣列:從起始位置開始遍歷數組,每次都檢查當前位置
i是否在max_reachable的範圍內(即i <= max_reachable)。- 如果可以達到該位置,則更新
max_reachable為max(max_reachable, i + nums[i])。 - 如果在遍歷過程中
max_reachable超過或等於最後一個位置,則說明可以到達終點,返回True。
- 如果可以達到該位置,則更新
- 檢查是否無法到達:如果遍歷結束後
max_reachable仍然小於最後一個位置,則返回False。
範例代碼
以下是 Python 的實現:
1
2
3
4
5
6
7
8
9
10
11
def canJump(nums):
max_reachable = 0 # 初始化最遠可達位置
for i in range(len(nums)):
if i > max_reachable: # 如果當前位置超出可達範圍,返回 False
return False
max_reachable = max(max_reachable, i + nums[i]) # 更新最遠可達位置
if max_reachable >= len(nums) - 1: # 如果可以到達或超過最後位置,返回 True
return True
return False
代碼解析
- 初始化
max_reachable:從位置0開始跳,初始化max_reachable為0。 - 更新可達範圍:遍歷數組,每當遇到新位置
i時,如果i在max_reachable範圍內,則更新max_reachable,使其等於max(max_reachable, i + nums[i])。 - 提前返回:若在遍歷過程中,
max_reachable超過或達到最後位置,則返回True,表示可以跳到終點。 - 無法到達的情況:如果遍歷結束後
max_reachable無法到達最後位置,則返回False。
時間和空間複雜度
- 時間複雜度:O(n),其中
n是數組的長度,我們只需遍歷數組一次。 - 空間複雜度:O(1),只使用了常數空間來存儲變量。
本文章以 CC BY 4.0 授權