LeetCode 热题 HOT — 跳跃游戏

77 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第 15 天,点击查看活动详情

跳跃游戏

原题地址

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

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

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

示例 1:

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

示例 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

提示:

  • 1 <= nums.length <= 3 *10410^4
  • 0 <= nums[i] <=10510^5

思路分析

  1. 分析题目可以得知,想要判断是否可以到达最后一个下标,那么往前递推,如果可以到达 第nums.length-2 个下标,并且nums[nums.length - 2] 不为0,那么就可以到达第 nums.length-1个下标;
  2. 因此我们使用一个数组 dp 来表示是否能到达下标 i,对于每个位置 i 来说,只需要判断是否能从前面的位置跳跃过来即可;对于当前位置 j 来说,能否跳到 i 的判断条件为:可以到达 j 位置,并且 j 位置的值加上 下标j 大于 下标i,若满足这个条件,就将 dp[i] 更新为 true;
  3. 遍历完成后,可以得到一个能否到达下标 i 的数组,返回 dp[num.length - 1] 即可。

AC 代码

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canJump = function(nums) {
    const len = nums.length
    let dp = new Array(len).fill(false) //初始化dp
    dp[0] = true //第一项能到达
    for (let i = 1; i < len; i++) {
        for (let j = 0; j < i; j++) {
            //当前位置j能达到,并且当前位置j加上能到达的位置如果超过了i,那dp[i]更新为ture,便是i位置也可以到达
            if (dp[j] && nums[j] + j >= i) {
                dp[i] = true
                break
            }
        }
    }
    return dp[nums.length - 1]
};

结果:

  • 执行结果: 通过
  • 执行用时:1772 ms, 在所有 JavaScript 提交中击败了5.03%的用户
  • 内存消耗:46.5 MB, 在所有 JavaScript 提交中击败了15.95%的用户
  • 通过测试用例:170 / 170

END