LeetCode55 跳跃游戏
四月打卡系列
题解
方法一:正推
能否达到最后的位置在于——前面存在某个位置X自己本身可以到达,并且可以跳到最后位置
那么如示例一所示:
nums[1],可以由nums[0]到达,并且nums[1]+1 >=nums.lenth-1
示例二:
nums[1],可以由nums[0]到达,但nums[1]+1 < nums.lenth-1
nums[2],可以由nums[1]到达,但nums[2]+2 < nums.lenth-1
同理其余均不可以到达最后位置
我们将可以跳到最后位置的这个值称作最大跳跃值,在循环时,要确保所选中的X是本身到达的。
class Solution {
public boolean canJump(int[] nums) {
int len = nums.length;
int rightmax = 0;
for (int i = 0; i < len; i++) {
if (rightmax >= len - 1) {
return true;
}
if (i <= rightmax) {
rightmax = Math.max(rightmax, i + nums[i]);
}
}
return false;
}
}
方法二:反推
原理如上,只是反推
首先找到某个值nums[i]+i >= 跳到最后位置所耗距离的最小值len-1
然后只需要确定 i 这个位置是可以到达的就可以了
class Solution {
public boolean canJump(int[] nums) {
if (nums == null) {
return false;
}
int temp = nums.length-1;
for(int i=nums.length-2;i>=0;i--){
if(temp<=nums[i]+i){
temp=i;
}
}
return temp==0;
}
}