题干
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
示例 2:
输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你
想法
因为数组中的每个元素代表你在该位置可以跳跃的最大长度。所以如果只要这个数不为0我甚至可以每一次都走1,那就肯定走的完。
动态规划的想法,用longgest来表示能到的最远距离,状态转化方程是
longgest=Math.max(longgest,index+nums[i]);其中index是现在的位置。
话不多说直接上代码
Java代码
class Solution {
public boolean canJump(int[] nums) {
int index=0;//当前位置
int longgest=0;//可到达的最远距离
for(int i=0;i<nums.length&&index<=longgest;i++){
longgest=Math.max(longgest,index+nums[i]);
index++;
}
return (longgest>=nums.length-1);
}
}
大佬的代码,从末尾往前遍历逐步递归简化问题
class Solution {
public boolean canJump(int[] nums) {
boolean can = true;
if (nums.length < 2){
return can;
}
int n = nums.length;
int stride = 1;
for (int i = n - 2; i >= 0; i--) {
if (nums[i] < stride) {
stride++;
can = false;
} else {
can = true;
stride = 1;
}
}
return can;
}
}