题目
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
示例 1:
输入: nums = [2,3,1,1,4]
输出: true
解释: 可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
题解
方式一:贪心
复杂度:O(n)
public boolean canJump(int[] nums) {
int len = nums.length;
if (len == 1) {
return true;
}
int min = 1; // 当前位置必须满足的条件,即 nums[i] >= min 才能到达终点
for (int i = len - 2; i >= 0; i--) {
if (i == 0 && nums[i] < min) {
// nums[0] 不满足,无法到达终点
return false;
}
if (nums[i] >= min) {
// nums[i] 满足,那么nums[i - 1]只需要保证能到nums[i]即可
min = 1;
} else {
// nums[i - 1]需要跳到上一个满足的下标才行
min++;
}
}
return true;
}
方式二:贪心
复杂度:O(n)
public boolean canJump(int[] nums) {
int len = nums.length;
int rightmost = 0; // 最远能到达的位置
for (int i = 0; i < len - 1; i++) {
if (i <= rightmost) {
// i 是能够到达的,更新最远位置
rightmost = Math.max(rightmost, nums[i] + i);
// 更新完如果已经能到达终点,结束
// 相比第一种方式可以更早的结束遍历
if (rightmost >= len - 1) {
return true;
}
}
}
return false;
}
总结
算法:贪心