解法1
模拟
动态规划
java
class Solution {
public boolean canJump(int[] nums) {
int n = nums.length;
boolean[] reachArr = new boolean[n];
reachArr[n - 1] = true;
for (int i = n - 2; i > -1; i--) {
int right = Math.min(nums[i] + i + 1, n);
for (int j = i + 1; j < right; j++) {
if (reachArr[j]) {
reachArr[i] = true;
break;
}
}
}
return reachArr[0];
}
}
解法2
累计可达距离大于等于n-1,则可以达到。
遍历每个元素,计算在当前位置基础上,最大可达右边界。
维持一个最大可以到达的右边界。
java
class Solution {
public boolean canJump(int[] nums) {
int n = nums.length;
int rightmost = 0;
for (int i = 0; i < nums.length; i++) {
// 当前位置可达
if (i <= rightmost) {
// 尝试更新右边界
rightmost = Math.max(rightmost, i + nums[i]);
if (rightmost >= n - 1) {
return true;
}
}
}
return false;
}
}