方法一:贪心
思路:
如果某一个作为起跳点的格子可以跳跃的距离是 3,那么表示后面 3 个格子都可以是起跳点
可以对每一个能作为起跳点的格子都尝试跳一次,把能跳到最远的距离不断更新
如果可以一直跳到最后,就成功了
public static boolean canJump(int[] nums){
if(nums==null||nums.length==0) return false;
int max=0;//能跳的最远距离
for(int i=0;i<=max;i++){
max=Math.max(max,i+nums[i]);
if(max>=nums.length-1){
return true;
}
}
return false;
}
将代码进行优化:
dp[i]表示index=i时可以跳的最远距离。
dp[i]的值是dp[i-1]可以跳的最远距离-1与以该下标为起点所能跳的最远距离取最大值
每次循环开始前需要判断dp[i-1]是否为0,因为如果为0就跳不到当前位置 i
public static boolean canJump(int[] nums){
int len=nums.length;
int lastDp=nums[0];
for(int i=1;i<len;i++){
if(lastDp==0) return false;
lastDp=Math.max(lastDp-1,nums[i]);
}
return true;
}
方法二:动态规划
public boolean canJump(int[] nums) {
boolean[] dp=new boolean[nums.length];
dp[0]=true;
for(int i=1;i<nums.length;i++){
for(int j=0;j<i;j++){
if(dp[j]&&nums[j]+j>=i){
dp[i]=true;
break;
}
}
}
return dp[nums.length-1];
}