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 授權