jump-game-ii

/**
* 給出一個非負整數數組,你最初在數組第一個元素的位置
* 數組中的元素表明你在這個位置能夠跳躍的最大長度
* 你的目標是用最少的跳躍次數來到達數組的最後一個元素的位置
* 例如
* 給出數組 A =[2,3,1,1,4]
* 最少須要兩次才能跳躍到數組最後一個元素的位置。
*(從數組下標爲 0的位置跳長度1到達下標1的位置,而後跳長度3到數組最後一個元素的位置)
*/

/**
 * 給出一個非負整數數組,你最初在數組第一個元素的位置
 * 數組中的元素表明你在這個位置能夠跳躍的最大長度
 * 你的目標是用最少的跳躍次數來到達數組的最後一個元素的位置
 * 例如
 * 給出數組 A =[2,3,1,1,4]
 * 最少須要兩次才能跳躍到數組最後一個元素的位置。
 *(從數組下標爲 0的位置跳長度1到達下標1的位置,而後跳長度3到數組最後一個元素的位置)
 */

public class Main57 {
    public static void main(String[] args) {
        int[] A = {2,3,1,1,4};
        System.out.println(Main57.jump(A));
    }

    public static int jump(int[] A) {

//        int[] dp = new int[A.length]; // dp存放都到各點的最小步數
//        for (int i = 0; i < dp.length; i ++) {
//            int maxPosition = Math.min(i + A[i], A.length - 1); // 從i點出發能走的最遠距離
//            for (int j = i + 1; j <= maxPosition; j ++) {
//                if(dp[j] == 0) dp[j] = dp[i] + 1; // 若是位置沒被走過,則到達j點的步數爲dp[i]+1
//        }
//            if(dp[A.length - 1] != 0) break; // 當第一次到達終點時,確定是到達終點最短的步數
//        }
//        return dp[A.length - 1];
        int jumps = 0, curEnd = 0, curFarthest = 0;
        for (int i = 0; i < A.length - 1; i++) {
            curFarthest = Math.max(curFarthest, i + A[i]);
            if (i == curEnd) {
                jumps++;
                curEnd = curFarthest;
            }
        }
        return jumps;
    }
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息