package algorithm;
/**
参考:https://blog.csdn.net/scarlett_guan/article/details/80159621
题目:
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
例如:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
实例:
input{ 7, 0, 9, 6, 9, 6, 1, 7, 9, 0, 1, 2, 9, 0, 3}
初始化:i=0,位于起始位置input[0]=7, 如果只有一个元素,则无需步行,直接返回为0。
解释:
当数组数-1<=7时,只需一步,即可走完全程。 即
走一步能走最大距离为7,令最大值为aa=7
当需要2步时,能走的最大距离为:i+input[i], max(aa,i+input[i]),其中i为i=1-7. 此时aa最大为14.i=7.
当需要第3步时,走的最大距离为:i+input[i],此时i=8-14, 找最大max(aa,i+input[i])
*/
public class JumpGame {
public static int getSteps(int[] input){
if(input.length==1){
return 0;
}
int maxSpace=input[0];
int steps=1;
int tmp=maxSpace;
for(int i=1;i<input.length;i++){
if(maxSpace>=input.length-1)
return steps;
while(i<maxSpace){
tmp=Math.max(tmp,i+input[i]);
i++;
}
maxSpace=Math.max(tmp, maxSpace+input[maxSpace]);
steps++;
}
return steps;
}
public static void main(String[] args) {
//int[] input={ 7, 0, 9, 6, 9, 6, 1,7, 9, 0, 1, 2, 9, 0, 3};
int[] input={2,4,1,1,4,1};
int result=getSteps(input);
System.out.println("结果为:"+result);
}
}