题意:
给定一个非负整数数组,您首先被定位在数组的第一个索引处。
数组中的每个元素表示该位置的最大跳跃长度。
确定是否能够到达最后一个索引。
例如:
A=[2,3,1,1,4],返回真。
A=[3,2,1,0,4],返回假。
解题:
定义一个能跳跃达到的最大长度maxlen = A[0]+1
然后遍历A数组
如果最大长度不能跳到当前点i+1,返回false
如果最大长度能达到终点len,返回true
遍历每个点时更新一下maxlen就行
public class Solution {
public boolean canJump(int[] A) {
int maxlen = A[0]+1;
int len = A.length;
if(len==1)return true;
for(int i=1;i<len;i++){
if(maxlen>=len){//最大跳跃距离大于等于终点
return true;
}
else if(i+1>maxlen){//最大跳跃距离到不了第i步
return false;
}
else if(i+1<=maxlen){
if(1+i+A[i]>maxlen){
maxlen = 1+i+A[i];
}
}
}
return true;
}
}
jump-game-ii(求跳到终点的最少步数)
给定一个非负整数数组,您首先被定位在数组的第一个索引处。
数组中的每个元素表示该位置的最大跳跃长度。
您的目标是在最小跳跃次数内达到最后一个索引。
例如:
给定数组a=[2,3,1,1,4]
到达最后一个索引的最小跳转数是2。(从索引0跳1步到1,然后跳3步到最后一个索引。)
import java.util.*;
public class Solution {
public int jump(int[] A) {
int len = A.length;
int dp[] = new int[len];
dp[0]=0;
for(int i=1;i<len;i++){
dp[i] = 99999999;
}
for(int i=0;i<len;i++){
if((i+A[i])>=len){
for(int j=i+1;j<len;j++){
dp[j] = Math.min(dp[j],dp[i]+1);
}
}
else{
for(int j=i+1;j<=i+A[i];j++){
dp[j] = Math.min(dp[j],dp[i]+1);
}
}
}
return dp[len-1];
}
}