给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
本题思路大概如下:
对于末尾一点,他是肯定能够到达的,所以 dp[len-1]=1;表示可行
接着从尾往前遍历 对每一个点 都往他的 可能调到的点去找,例如 【2,1,3,5,1】 对于第2个元素来说 ,它可以调到的位置有 3, 所以我们只用看dp【3】是否为1 (即看第3 个点能否调到最后一个点 ) 第三个点可以调到最后一个点 则 dp【3】=1 ;则dp【2】=1 。
在最后返回的时候只用看dp【0】是否为1 即可
class Solution {
public boolean canJump(int[] nums) {
// 1. 从后往前看,对能到最后一个的下表位置 置位 1 初始化:dp【nums.length-1】=1;
// 从后往前推 对 dp【i】 若果 从i到末尾的距离大于了nums【i】的最大值 置位0 表示不能到达 ,从尾到头看dp【0】的值即可
int len = nums.length;
int [] dp =new int [len];
for(int i=0;i<len;i++){
dp[i]=-1;
}
if(len<=1){
return true;
}
//初始化
dp[len-1]=1;
//计算在第i点可以跳的距离
for(int i =len-2 ;i>=0;i--){
int far = Math.min(i+nums[i],len-1);
//j代表的是i能够走道的位置如果存在一个dp【j】=1那么 dp【i】就一定为1
for(int j=i+1;j<=far;j++){
if(dp[j]==1){
dp[i]=1;
break;
}
}
}
if(dp[0]==1){
return true;
}else{
return false;
}
}
}
403

被折叠的 条评论
为什么被折叠?



