题目描述:
给定一个非负整数数组 nums
,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
思路:
感觉贪心的算法都不长,但是需要找到贪心的点!
这道题就是将能够到达的位置,每次贪心的取到最远位置,看能不能到达最尾部!
自己的思路在考虑能不能 越过 0的位置,不容易想
代码:
1)保留下自己的思路:
想不到i这里怎么处理:
想到了 i 要按照他自己能够到达的位置 作为限制条件;
但是没有想到实时更新最大可到达返回,这里就是贪心!
class Solution {
//落在0位置上就会false;
//只要不会经过0位置,就不会出问题!
public boolean canJump(int[] nums) {
for(int i = 0;i < nums.length;i++){
for(int j = i;j <= i + nums[i] && j < nums.length;j++){
if(nums[j] == 0 && j != nums.length - 1) return false;
}
}
return true;
}
}
2)贪心算法
class Solution {
//落在0位置上就会false;
//只要不会经过0位置,就不会出问题!
public boolean canJump(int[] nums) {
if(nums.length == 1) return true;
//按照覆盖范围来进行;
//之前自己按照能不能越过0,不好写
int cover = 0;//也就是能够到达位置的下标
//每次更新所能到达的位置的最大下标
for(int i = 0;i <= cover;i++){
cover = Math.max(cover,i + nums[i]);
//能够到尾部!
if(cover >= nums.length - 1) return true;
}
return false;
}
}