1. 程式人生 > >LeetCode筆記——55跳躍遊戲

LeetCode筆記——55跳躍遊戲

題目:

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

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

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

示例 1:

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

示例 2:

輸入: [3,2,1,0,4]
輸出: false
解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後一個位置。

在網上找的大神的程式碼先把程式碼看懂。。。。原文:https://blog.csdn.net/shinanhualiu/article/details/50550825?utm_source=copy

思路一:使用了貪心演算法從陣列的第一個元素開始計算計算所能到達的最遠的下標記錄在currMaxSep中。後面如果有更大的元素則進行替換。

程式碼:

class Solution {
    public boolean canJump(int[] nums) {
      int currMaxStep = nums[0]; //當前能夠跳躍的最大步數
     for (int i = 1; i < nums.length; ++i)
        { if (i > currMaxStep) return false;  //當前座標不能到達
         currMaxStep = Math.max(i+nums[i], currMaxStep);
         if (currMaxStep >= nums.length-1)
             return true;
        }
        return currMaxStep >= nums.length-1;
 

    }
}

思路二:動態規劃

使用動態規劃首先要找到問題的狀態和狀態轉換的方程。假設陣列dp[i]中儲存的是位置i能夠儲存的最大長度。狀態轉移的方程如下:if dp[i-1]>=i(即i-1位置可以到達的最遠距離大於當前下標,也就是說可以到達當前位置)  則dp[i]=max{dp[i-1],nums[i]+i}

else dp[i-1]<i (即i-1位置不能到達當前位置)  dp[i]=0

public static boolean canJumpDP(int [] A) {

if (A.length == 1)

return true;

int [] dp = new int[A.length];

dp[0] = A[0];

for (int i = 1; i < dp.length; ++i) {

if (dp[i-1] >= i)  %可以到達當前下標

dp[i] = max(A[i]+i, dp[i-1]);  %當前位置能到達的最遠位置是這兩個中的最大值

else

dp[i] = 0;

}

eturn dp[dp.length-1] >= A.length-1;

}


執行最快的程式碼

看不懂。。。。。。

class Solution {
    public boolean canJump(int[] nums) {
        if(nums.length == 1){
            return true;
        }
        for(int i = nums.length-1; i > -1; i--){
            if(nums[i] == 0){
                int tmp = i--;
                //跳過與跳到
                int range = tmp == nums.length-1 ? tmp-1 : tmp;
                while(i > -1 && nums[i] <= range-i){
                    i--;
                }
                if(i == -1){
                    return false;
                }
            }
        }
        return true;
    }
}