Leetcode: 跳跃游戏

23 阅读2分钟

原题:leetcode.cn/problems/ju…

题目描述

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

解题思路

  1. 贪心策略
    • 维护当前可到达的最远位置 maxReach
    • 遍历数组,实时更新最大覆盖范围
  2. 实时决策
    • 若当前位置超过当前 maxReach 则失败
    • 若 maxReach 已覆盖终点则提前终止
  3. 边界处理
    • 空数组直接返回false
    • 单元素数组默认成功
  4. 动态更新
    • maxReach = max(maxReach, i + nums[i])
    • 仅需遍历到当前 maxReach 位置

关键洞察

  1. 覆盖范围原理
    • 能否到达终点  ⇔ 最大覆盖范围是否包含终点
    • 无需考虑具体跳跃路径
  2. 贪心最优性
    • 局部最大覆盖保证全局可达性
    • 提前终止优化性能
  3. 位置依赖性
    • 当前位置可达性依赖于前一状态
    • 不可到达的位置立即失败
  4. 空间优化
    • 仅需单个变量存储覆盖范围
    • 避免使用额外数组存储状态

复杂度分析

指标说明
时间复杂度O(n):最坏情况遍历整个数组
空间复杂度O(1):仅使用常数级别额外空间

代码实现

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

实际应用场景

  1. 机器人路径规划:工业机器人臂的关节移动范围判断`
  2. 游戏AI导航:角色平台跳跃关卡的可达性分析`
  3. 网络路由优化:数据包在多跳网络中的最大传输距离`
  4. 供应链管理:货物在物流节点间的最大转运范围`

相似题目