55.跳跃游戏
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
方法一:
复杂度:n * n 1
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
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;
}