代码随想录第三十二天 | 55. 跳跃游戏、45.跳跃游戏II

102 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

55. 跳跃游戏

题目分析

给出一个非负整数数组,数组中每个元素代表在该位置可以跳跃的最大长度,判断是否能到达最后一个位置。

对于题目中给出的例子,nums=[2,3,1,1,4],我们可以从初始位置跳一步到达位置1,然后位置一的可跳跃的最大长度是3,刚好可以跳到最后一个位置。但是对于nums=[3,2,1,0,4]我们总会到达位置3,位置3的可以的跳跃的最大长度是0,也就是到位置3后就不能向后跳跃了,所以不能跳到最后一个位置。

解题

对于这道题,我们不必纠结在某一个位置上要跳多少步。因为本题要解决的就是能不能到达最后的位置,所以我们只需要判断可跳的位置的覆盖是否能到最后一步就可以了。

代码如下:

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

在上面的代码中,每走一步都会更新最远能跳跃的位置,如果最远能跳的位置大于等于最后一个位置,证明可以到达返回true即可。

45.跳跃游戏II

题目分析

这道题是上一道题的升级版,这次需要使用最少的跳跃次数来达到最后一个位置。

解题

这一次我们仍然要求覆盖范围,不过要增加一个变量,那就是走的步数。

代码如下:

var jump = function(nums) {
    let curIndex = 0,nextIndex = 0,steps = 0
    for(let i = 0;i < nums.length - 1;i++) {
        nextIndex = Math.max(nums[i] + i,nextIndex)
        if(i === curIndex) {
            curIndex = nextIndex
            steps++
        }
    }
    return steps
};

从上面的代码可以看出,当走到上一个最大覆盖范围时,更新上一个最大覆盖范围,并将步数加一。这样我们就可以求出最短的步数。