题目
给定一个非负整数数组 nums
,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
方法一:暴力解法
思路:
因为规定是非负整数数组 nums
,那么只有一种情况会地大不了最后一个下标,那就是下表值为0且0的前面没有值可以跳过这个下标。我们维护一个dp[n]表示可以抵达,当下标值为0,那么下标值+1为false则返回false。
代码
class Solution {
public boolean canJump(int[] nums) {
int len = nums.length;
if(len <= 1){
return true;
}
boolean[] dp = new boolean[len];
len--;
for(int i=0; i < len; i++){
if (i + nums[i] >= len){
return true;
}else {
if (nums[i] != 0){
for (int j = i; j <= i + nums[i] ; j++) {
dp[j] = true;
}
}else {
if (!dp[i + 1]){
break;
}
}
}
}
return false;
}
}
方法一:贪心
思路:
每次从i起跳,抵达最远距离j。那么就表示从i->j全部是可达的记录,当i大于j的时候就表示无法抵达最后一个下标位置了。
代码
class Solution {
public boolean canJump(int[] nums) {
int len = nums.length;
int lenMax = 0;
for(int i=0; i < len; i++){
if (i <= lenMax){ //当前的下标i,一定要在可抵达的范围内
lenMax = Math.max(lenMax,i+nums[i]);//记录最远可以抵达的下标位置
if (lenMax >= len - 1){ // 已经可以抵达最后一个下标位置
return true;
}
}else{
return false;
}
}
return false;
}
}