leetcode hot 100-55. 跳躍遊戲
阿新 • • 發佈:2020-10-31
55. 跳躍遊戲
給定一個非負整數陣列,你最初位於陣列的第一個位置。
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最後一個位置。
示例1:
輸入: [2,3,1,1,4] 輸出: true 解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然後再從位置 1 跳 3 步到達最後一個位置。
示例2:
輸入: [3,2,1,0,4] 輸出: false 解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後一個位置。
題意:
從第一個元素開始,每次最大可以跳當前元素值的格子數,也就是可以到達i, i +1, ... , i + nums[i], 判斷最終是否能到達最後一個位置。
思路:
思路參考:https://leetcode-cn.com/problems/jump-game/solution/tiao-yue-you-xi-by-leetcode-solution/
維護一個rightMost變數,這個變數記錄了當前能到達的最右邊的位置下標,遍歷陣列:
如果當前下標大於rightMost,說明不可達當前位置,直接返回false,因為如果 當前位置都不可達,那更不可能到達最後一個位置;
如果rihgtMost大於等於陣列長度減一,直接返回true;
如果 i + nums[i] 大於 rightMost, 則更新rightMost變數的值,
迴圈結束後返回true 或者false都沒有關係,因為無論是否能達到最後一個位置,在迴圈內部都會得出結果然後直接返回 true或者 fasle, 所以根本不會執行到最後一行
1 class Solution { 2 public boolean canJump(int[] nums) { 3 4 int rightMost = 0; 5 int len = nums.length; 6 // 遍歷陣列,每次更新能到達的最右邊的位置下標rightMost 7 for(int i = 0; i < len; i++){ 8 // 如果當前下標大於rightMost,說明不可達當前位置,直接返回false 9 if(i > rightMost){leetcode 執行用時:2 ms > 81.46%, 記憶體消耗:40.7 MB > 61.24%10 return false; 11 } 12 // 如果rihgtMost大於等於陣列長度減一,直接返回true 13 if(rightMost >= len - 1){ 14 return true; 15 } 16 17 // 更新rightMost 18 rightMost = Math.max(rightMost, nums[i] + i); 19 } 20 // 迴圈結束返回true或者false都可以,因為根本不會執行到這裡 21 return true; 22 } 23 }