题目
- 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。
- 注意:这里的到达最后一个位置表示的是只要经过就行,不一定非要刚好到达最后一个下标
示例1
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例2
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
解题
- 这里我们使用贪心算法进行解决的,我们记录一个坐标表示目的下标,只要可以到达这个节点,就表示可以跳到最后,我们从后向前遍历,逐渐缩小这个目标下标,如果这个目标下标最后是0,即数组第一个元素的下标,我们就表示这个数组是可以跳到最后的。
java代码
- 详细可以参考注释
public boolean canJump(int[] nums) {
// 当数组是空的时候,肯定返回的是false
if(nums == null){
return false;
}
// pos表示需要到达的位置
// 目标是跳到最后一个元素的位置
int pos = nums.length - 1;
// 架起循环开始判断,从后向前遍历,这样效率会高点
// i 表示当前遍历的是数组哪个位置,表示的就是从哪个位置开始跳,初始定位最后一个下标的前一个位置,因为数组只有一个下标肯定可以过去
for (int i = nums.length - 2 ; i >= 0 ; i--) {
// 这里只要是待跳的节点的下标加上该下标对应的数组中的值大于等于最后要到达的位置,此时就可以进行跳跃
if(nums[i] + i >= pos){
// 更新最新的目标位置,此时只要跳到刚才确定的待跳的下标即可
pos = i;
}
}
// 如果最后的目标节点的下标是0,表示的是可以跳到最后(只要经过就行)
return pos == 0;
}
补充
这里我们只使用了一种算法,还有很多种算法我们可以实践,具体可以查看leetcode上的解决方案。