今天接力昨天的貪婪演算法:
題目
程式碼
Java 解法
public boolean canJump(int[] nums) {
int maxReach = 0;
for (int i = 0; i < nums.length; i++) {
if (i > maxReach) return false;
maxReach = Math.max(maxReach, i + nums[i]);
}
return true;
}
Python 解法
def canJump(nums):
max_reach = 0
for i in range(len(nums)):
if i > max_reach:
return False
max_reach = max(max_reach, i + nums[i])
return True
range(len(nums)):會生成一個從 0 開始、到 len(nums)-1 結束的數列。
for i in range(len(nums))::表示 i 會依序取這個數列的值,從頭到尾掃過整個陣列的意思。
max_reach 的意思是:目前能夠跳到的最遠位置,max_reach = max(max_reach, i + nums[i]) 。
這題的程式邏輯幾乎一樣:Java 需要嚴謹的變數型別宣告,像 int maxReach = 0; ,並用 Math.max() 更新最大值;Python 比較簡單,直接寫 max_reach = 0,用內建函式 max() 就能完成。
測試案例解析
Case 1
print(canJump([2,3,1,1,4]))
Case 2
print(canJump([3,2,1,0,4]))
複雜度分析
心得
這題核心思路是 「動態更新最遠可達位置」:
用貪婪法記錄目前能跳到的最遠範圍。如果走到某個位置發現「超過能到的範圍」,那就直接判定失敗;如果一路都能走到,最後一定可以抵達終點。
貪婪法的優勢在於:不用回頭看也不用窮舉,只要作出「能跳最遠」的選擇,就能正確判斷結果。這讓演算法保持在 O(n) 的效率。