给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置
数据范围:
1 <= nums.length <= 10^4
0 <= nums[i] <= 1000
输入和输出示例:
输入1:
5
2, 3, 1, 1, 4
输出1:
2
解释:
跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
输入2:
5
2, 3, 0, 1, 4
输出2:
2
题解:该题解题思路为 比较当前能跳到的所有格子里,下一步所能达到的最远位置,通过比较 该格子坐标+可以跳多远,选择下一步可以跳到最远的那个格子
import java.util.Scanner;
public class Road {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //输入n个数
int nums[]= new int [n];
sc = new Scanner(System.in);
String str = sc.nextLine().toString();
String []arr = str.split(",");
for(int i = 0;i<n;i++) {
if(!arr[i].isEmpty())
nums[i] = Integer.parseInt(arr[i]); //将String类型转化为Int
}
int j= 0,k = 0; // j表示当前格子
while(true) {
if(j+nums[j] >=n-1) { //如果当前位置可以直接跳到最后一个位置,则退出循环
k++;
break;
}
int temp = j + nums[j];
int flag=0; //到达的位置
for(int i= j;i<= j +nums[j];i++) { //比较当前格子能下一步能跳到的格子中哪个能跳最远
if(i+ nums[i]>temp)
{
temp = i+nums[i]; //下一步到达的格子最远能到达 temp坐标
flag = i; //下一步到达的坐标
}
}
j = flag;
k++;
}
System.out.println(k);
}
}