1. 程式人生 > 資訊 >OPPO 小布助手現已支援粵語模式,自稱粵語十級學者

OPPO 小布助手現已支援粵語模式,自稱粵語十級學者

題目來源

55. 跳躍遊戲

題目詳情

給定一個非負整數陣列nums ,你最初位於陣列的 第一個下標

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

判斷你是否能夠到達最後一個下標。

示例1:

輸入: nums = [2,3,1,1,4]
輸出: true
解釋: 可以先跳 1 步,從下標 0 到達下標 1, 然後再從下標 1 跳 3 步到達最後一個下標。

示例2:

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

提示:

  • 1 <= nums.length <= 3 * 104
  • 0 <= nums[i] <= 105

題解分析

解法一:暴力法

  1. 暴力法的思想很簡單,就是先定義一個boolean陣列,用來儲存當前位置是否可達。
  2. 這種方法的時間複雜度為\(O(n)\),空間複雜度為\(O(n)\)
class Solution {
    public boolean canJump(int[] nums) {
        int n = nums.length;
        boolean[] dp = new boolean[n];
        dp[0] = true;
        for(int i=0; i<n; i++){
            if(dp[i]){
                int now = nums[i];
                for(int j=1; j <= now && (i+j) < n; j++){
                    dp[i + j] = true;
                }
            }
        }
        return dp[n-1];
    }
}

解法二:貪心法

  1. 貪心法的思想是維護一個【最右可達位置】,在每次迭代時維護該變數可以知道是否可以到達當前位置。
  2. 如果在遍歷的過程中,最右可達位置大於等於陣列最大下標則說明可以跳躍到最後的位置,否則返回false。
class Solution {
    public boolean canJump(int[] nums) {
        int n = nums.length;
        int right = 0;
        for(int i=0; i<n; i++){
            if(i <= right){// 可以到達該位置
                right = Math.max(right, i + nums[i]);
                if(right >= n-1){
                    return true;
                }
            }
        }
        return false;
    }
}
Either Excellent or Rusty