前端算法(43)

44 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给定一个非负整数数组 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
};