1. 程式人生 > >跳躍遊戲 II

跳躍遊戲 II

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

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

你的目標是使用最少的跳躍次數到達陣列的最後一個位置。

示例:

輸入: [2,3,1,1,4]
輸出: 2
解釋: 跳到最後一個位置的最小跳躍數是 2。
從下標為 0 跳到下標為 1 的位置,跳 1 步,然後跳 3 步到達陣列的最後一個位置。
說明:

假設你總是可以到達陣列的最後一個位置。

(1)
方法:貪婪演算法
思路:很簡單,從陣列開頭開始,拿到下個座標開始到nums[i]座標區間中能走的最遠距離的座標,通俗點兒就是拿到拿到k從i + 1座標到i + nums[i]中 k + nums[k]最大時的k值,然後把k值賦給i,並且步數加一,並開始下一輪迴圈,直到i + nums[i] >= nums.length - 1,說明再走一步就走完陣列了,此時步數再加一返回就是答案;

class Solution {
    public int jump(int[] nums) {
        if (nums .length < 2)
            return 0;
        int i = 0, j = 0, len = nums.length;//記錄當前座標和元素
        int count = 0;//結果
        while (i < len) {
            if (i + nums[i] >= len - 1) {//已經超出或者剛好滿足
                count ++;
                return count;
            }
            int temp = -1;
            for (int k = i + 1; k <= i + nums[i]; k ++) {
                if (temp < k + nums[k]) {//拿到沒一次課跳最遠的座標
                    temp = k + nums[k];
                    j = k;
                }
            }
            i = j;
            count ++;
        }
        return 0;
    }
}

(2)
改進:思路差不多,只是直接遍歷陣列,每次都拿到當前下標i元素能走到的最遠距離,當最遠距離小於i時,說明走不到了,那麼就需要跳,則步數加一,並且拿到前面元素中所能走到的最遠距離,繼續後續判斷,看能在這個距離內否走完全部陣列;

class Solution {
    public int jump(int[] nums) {
        int reachable = 0;
        int next = 0;
        int jump = 0;
        for (int i = 0; i < nums.length; i++){
            if (reachable < i){
                jump++;
                reachable = next;//如果不能到達,證明需要多跳一步,reachable就更新為前面節點所能到達的最遠位置
            }
            next = Math.max(next,i+nums[i]);//當前i節點最遠能reach的位置
        }
        return jump;

    }
}