本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
题目解析
思路一
我们可以先从0开始走,初始可走步数是nums[0],然后再进行循环,如果可走步数为0或者到了nums末尾结束循环,每次循环需要
curr--,我们每次往前走一格之后都需要跟nums[index]比较,取较大值,最后判断是否走到末尾,在进行返回
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function (nums) {
if (nums.length === 0) {
return true;
}
let index = 1, curr = nums[0];
//可走步数为0或者到了末尾结束
for (; curr !== 0 && index < nums.length; index++) {
//每次往前走一格
curr--;
if (curr < nums[index]) {
//如果当前可走步数更多,就换成更大的
curr = nums[index];
}
};
return index === nums.length;
}
思路二
首先我们取出前n-1个元素组成一个新的数组,然后进行判断每个元素在当前位置可不可以直接到达甚至超过终点,在进行持续遍历数组,依次找前一个元素,如果前一个元素索引加上他的值可以超过0元素所在的位置(找到数组头的前一个了还没找到就返回false),就继续遍历,直到结尾
/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function (nums) {
if(nums.length==1)
return true
var len = nums.length - 1;
var num = nums.slice(0, -1);
for (let i = 0; i < num.length; i++) {
if(num[i]===0)
{
let j=i-1;
if(num[j]===undefined)
return false
else if(num[j]+j<=i)
{
while(num[j]+j<=i)
{
j--;
}
if(num[j]===undefined)
return false
}
}
if (num[i] + i >= len)
return true
}
return false
};