给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:
A = [2,3,1,1,4],
return true.
A = [3,2,1,0,4],
return false.
格式:
第一行输入一个正整数n,接下来的一行,输入数组A[n]。如果能跳到最后一个下标,输出“true”,否则输出“false”
样例输入
5
2 0 2 0 1
样例输出
true
<span style="font-size:14px;">import java.util.Scanner;
public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();/** 思路:贪心算法;* 从第一个数开始, 寻找可以一个可以跳最远的点;* 例1:3 1 2 4 1 0 0* 1.从第一个位置0,可以跳到位置1和位置2和位置3;* 2.如果跳到位置1,那么最远就可以跳到位置(1+1);* 3.如果跳到位置2,那么最远就可以跳到位置(2+2);* 4.如果跳到位置3,那么最远就可以跳到位置(3+4);* 5.故选择跳到位置3 ,重复1.2.3步;* * 算法分析:* 1.如果选择跳到位置3 ,就无法跳到位置2和位置3, 那么会不会因此错过最优解? 答:不会!* 2.因为任意位置1和位置2能到达的位置, 位置3都可以到达;* 3.故不会错过最优解;*/int[]a = new int[n];for(int i= 0 ;i< n ;i++) {a[i] = sc.nextInt();}int i;int l; //左边界 控制搜索的起始位置int r; //右边界 控制搜索的终止位置for( i= 0 ;i< n && a[i]!= 0 ;) { //当a[i]==0 时 , 该位置为可到达的最远位置r = i + a[i];l = i + 1; for(int j= i+1 ;j< n && j<= i+a[i] ;j++) { //if(j+a[j] >= r){ //遍历可到达位置 能到达的最远位置r = j+ a[j]; //更新左右边界l = j;}}i = l; //左边界}if(i< n-1) {System.out.println("false");}else{System.out.println("true");}}
}</span>