如题:给定数组,问能否经历数组中的每个确定的步数使得可以从第一个位置开始到达最后一个位置
下面是我自己写的算法:
思想是这样:从第一个位置开始,我递归检查从第一个位置可以到达的所有可能位置是否可以到达数组末尾,可以就返回true,不可以就返回上一层递归中
public boolean canJump(int[] A) {
int i = 0;
if(A[i]>=A.length-1){
return true;
}
return canJumpPosition(i, A);
}
public boolean canJumpPosition(int i, int[] A) {
System.out.println("从第" + i + "位置能否到达数组末尾");
if (i >= A.length - 1) {
System.out.println("到达数组末尾");
return true;
}
// i位置分别经过A[i]步能否到达数组末尾
for (; A[i] > 0; A[i]--) {
System.out.println("检查经过" + A[i] + "步" + i + "位置能否到达数组末尾");
if (i + A[i] >= A.length - 1) {
// i位置直接经过A[i]步可以到达数组末尾
System.out.println("从第" + i + "位置可以到达数组末尾");
return true;
} else {
// 不能直接到达,查看可到达的位置是否可达
if (canJumpPosition(i + A[i], A) == true) {
return canJumpPosition(i + A[i], A);
} else {
continue;
}
}
}
// 循环结束,说明不能到达数组末尾,所以返回false
return false;
}
可是提交时不能AC,有一个input总是提示time limit exceeded,我在自己机子上运行它的input最多也就1ms,为什么会超时呢,不解,欢迎讨论。
以下是网上的方法:
算法思想:遍历数组,curMax记录当前位置可以到达的最远位置,用max记录所有以前步骤里可以到达的最远位置,在遍历过程中如果i>max,说明遍历到了不可以到达的位置, 返回false,如果出现max>=数组最大下标,返回true,说明存在这么个方式可以到达末尾
public boolean canJump(int[] A) {
if (A.length <= 1)
return true;
int curMax = 0;
int max = 0;
for (int i = 0; i < A.length - 1; i++) {
if (i > max)
break;
curMax = A[i] + i;
if (curMax > max) {
max = curMax;
}
if (max >= A.length - 1)
return true;
}
return false;
}