【问题描述】给一个非负整数数组。假设你最初的位置为0,数组中每一个元素的值代表你能跳跃最大的长度,判断是否能达到数组的最后一个位置
【输入形式】第一行数组长度
第二行输入一个非负整数数组
【输出形式】布尔类型的值
【样例输入】
5
1 2 3 1 4
【样例输出】
true
public class Exer2
{
//经典回溯法,时间复杂度为O(n)
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int[] arr = new int[N];
//判断数组,0表示还未进行判断,-1表示无法到达终点,1表示可以到达
//初始化为0
int[] judgeArr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = scan.nextInt();
}
System.out.println(Exer2.goStep(arr, judgeArr, 0));
scan.close();
}
//pos表示下标0~length-1
public static boolean goStep(int[] arr,int[] judgeArr,int pos)
{
int len = arr.length;
if(judgeArr[pos]==1)
{
return true;
}
if(judgeArr[pos]==-1)
{
return false;
}
if(arr[pos]+pos+1>=len)
{
judgeArr[pos] = 1;
return true;
}
//judgeArr==0时:
boolean judge = false;
for(int i=1;i<=arr[pos];i++)
{
judge|=goStep(arr,judgeArr,pos+i);
}
if(judge==false)
judgeArr[pos] = -1;
else
judgeArr[pos] = 1;
return judge;
}
}