题目描述
给出一个非负整数数组,你最初在数组第一个元素的位置
数组中的元素代表你在这个位置可以跳跃的最大长度
判断你是否能到达数组最后一个元素的位置
例如
A =[2,3,1,1,4], 返回 true.
A =[3,2,1,0,4], 返回 false.
思路:动态规划,dp[i]表示能不能到达第i个位置,初值均为false,能到达的就改为true, 依次遍历到最后
public class Solution {
public boolean canJump(int[] A) {
if(A.length<2)
return true;
boolean[] dp=new boolean[A.length];
dp[0]=true;
for(int i=0;i<A.length;i++){
if(dp[i]==true){
int range=Math.min(i+A[i],A.length-1);
for(int j=i+1;j<=range;j++){
dp[j]=true;
if(dp[A.length-1]==true){
return true;
}
}
}
}
return false;
}
}
题目描述
给出一个非负整数数组,你最初在数组第一个元素的位置
数组中的元素代表你在这个位置可以跳跃的最大长度
你的目标是用最少的跳跃次数来到达数组的最后一个元素的位置
例如
给出数组 A =[2,3,1,1,4]
最少需要两次才能跳跃到数组最后一个元素的位置。(从数组下标为0的位置跳长度1到达下标1的位置,然后跳长度3到数组最后一个元素的位置)
思路:动态规划,dp[i]表示到达第i个位置所需的最少步数
public class Solution {
public int jump(int[] A) {
if(A.length<2)
return 0;
int[] dp=new int[A.length];
dp[0]=0;
for(int i=0;i<A.length;i++){
int range=Math.min(i+A[i],A.length-1);
for(int j=i+1;j<=range;j++){
if(dp[j]==0){
dp[j]=dp[i]+1;
if(dp[A.length-1]>0)
return dp[A.length-1];
}
}
}
return dp[A.length-1];
}
}