1. 程式人生 > 實用技巧 >leetcode hot 100-55. 跳躍遊戲

leetcode hot 100-55. 跳躍遊戲

55. 跳躍遊戲

給定一個非負整數陣列,你最初位於陣列的第一個位置。

陣列中的每個元素代表你在該位置可以跳躍的最大長度

判斷你是否能夠到達最後一個位置。

示例1:

輸入: [2,3,1,1,4]
輸出: true
解釋: 我們可以先跳 1 步,從位置 0 到達 位置 1, 然後再從位置 13 步到達最後一個位置。

示例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){
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 }
leetcode 執行用時:2 ms > 81.46%, 記憶體消耗:40.7 MB > 61.24%

複雜度分析:

時間複雜度:O(n)。很明顯只有一個迴圈,所以最壞時間複雜度為O(n)。 空間複雜度:O(1)。只需要常數個變數的空間。