给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
方法一:
复杂度:n * n 1
java
class Solution {
public boolean canJump(int[] nums) {
int idx = nums.length -1;
// 标记最后一个位置
numsMark[idx] = -1;
while(idx != 0){
// 从最后一个位置,依次向前判断每个节点是否能到达。
// 能到达就标记出来,再向前判断。就可以判断是否能到达标记过的节点
isNext(nums, idx-1);
idx--;
}
if(nums[0] != -1) return false;
else return true;
}
public void isNext(int[] nums, int idx){
for(int i = idx; i <= idx + nums[idx]; i++){
if(nums[i] == -1) {
nums[idx] = -1;
return;
}
}
}
}
方法二:
复杂度:n 1
java
public boolean canJump(int[] nums){
// range 可达的最大范围
int range = 0;
// 依次前向移动,更新最大移动范围
for(int i = 0; i <= range; i++){
if(range >= nums.length) return true;
range = Math.max(range, i + nums[i]);
}
return false;
}