导航菜单

跳跃游戏

🟡 中等

题目描述

给定一个非负整数数组 nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。

示例 1

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

示例 2

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

提示

  • 1 <= nums.length <= 10^4
  • 0 <= nums[i] <= 10^5

解法

参考答案 (2 个标签)
贪心 O(n)

思路

维护一个变量 maxReach 表示当前能到达的最远位置。遍历数组,如果当前位置超过 maxReach,说明无法到达;否则更新 maxReach

代码实现

/**
 * @param {number[]} nums
 * @return {boolean}
 */
function canJump(nums) {
    let maxReach = 0;
    
    for (let i = 0; i < nums.length; i++) {
        if (i > maxReach) return false;
        maxReach = Math.max(maxReach, i + nums[i]);
    }
    
    return true;
}

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

图解

nums = [2, 3, 1, 1, 4]

i=0: maxReach = max(0, 0+2) = 2
i=1: maxReach = max(2, 1+3) = 4
i=2: maxReach = max(4, 2+1) = 4
i=3: maxReach = max(4, 3+1) = 4
i=4: maxReach = max(4, 4+4) = 8

遍历完成,返回 true

搜索