/**
* 给出一个非负整数数组,你最初在数组第一个元素的位置
* 数组中的元素代表你在这个位置可以跳跃的最大长度
* 你的目标是用最少的跳跃次数来到达数组的最后一个元素的位置
* 例如
* 给出数组 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; } }