leetcode 55. 跳跃游戏

89 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

55. 跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

示例 1:

输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

思路分析: 根据题目分析,我们可以知道本题需要计算能否跳到最后一个下标,而跳跃的距离则是每个位置的数值,那么数组的长度-1就是我们的跳跃的目标值,当我们从第一个位置跳走时可以跳两个位置,第二个位置可以跳3个位置,那么第一个最大距离则是下标2,而第二个位置最大距离则是下标4的位置,则能够到达目标位置。我们可以通过动态规划的思路来分析,我们循环整个数组,对每一个位置进行计算,得出当前位置的最大跳跃距离,然后与之前的最大跳跃距离相比取较大值。

var canJump = function(nums) {
    let end = nums.length-1
    let num = 0
    for(let i = 0;i <= end;i++){
        if(nums[i]+i>=end)return true
        num = Math.max(num,nums[i]+i)
    }
};

这样,通过一个额外空间保存当前位置之前最大跳跃距离,我们可以得到第一个能够跳到目标位置的元素,那么会不会有可能中间会出现连续的0导致无法跳到目标位置,那么我们怎么判断处理中间有0无法跳到目标元素的情况呢。

我们可以考虑一个情况,那就是当前位置计算出来的最大跳跃位置如果小于等于当前位置下标的时候,我们可以认为,这个数组的元素无法再继续跳下去了,会卡在当前位置,导致结果失败。

var canJump = function(nums) {
    let end = nums.length-1
    let num = 0
    for(let i = 0;i<=end;i++){
        if(nums[i]+i>=end)return true
        num = Math.max(num,nums[i]+i)
        if(num<=i)return false
    }
};