579 字
3 分钟
跳跃游戏

题目描述
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
解题思路
- 贪心策略:
- 维护当前可到达的最远位置
maxReach
- 遍历数组,实时更新最大覆盖范围
- 维护当前可到达的最远位置
- 实时决策:
- 若当前位置超过当前
maxReach
则失败 - 若
maxReach
已覆盖终点则提前终止
- 若当前位置超过当前
- 边界处理:
- 空数组直接返回false
- 单元素数组默认成功
- 动态更新:
maxReach = max(maxReach, i + nums[i])
- 仅需遍历到当前
maxReach
位置
关键洞察
- 覆盖范围原理:
- 能否到达终点 ⇔ 最大覆盖范围是否包含终点
- 无需考虑具体跳跃路径
- 贪心最优性:
- 局部最大覆盖保证全局可达性
- 提前终止优化性能
- 位置依赖性:
- 当前位置可达性依赖于前一状态
- 不可到达的位置立即失败
- 空间优化:
- 仅需单个变量存储覆盖范围
- 避免使用额外数组存储状态
复杂度分析
指标 | 说明 |
---|---|
时间复杂度 | O(n):最坏情况遍历整个数组 |
空间复杂度 | O(1):仅使用常数级别额外空间 |
代码实现
const canJump = (nums) => { if (nums.length === 0) return false; if (nums.length === 1) return true; let maxReach = 0; for (let i = 0; i < nums.length; i++) { // 当前位置已超出可达范围 if (i > maxReach) return false; // 更新最远可达位置 maxReach = Math.max(maxReach, i + nums[i]); // 已覆盖终点则提前终止 if (maxReach >= nums.length - 1) return true; } return false;};
实际应用场景
- 机器人路径规划:工业机器人臂的关节移动范围判断`
- 游戏AI导航:角色平台跳跃关卡的可达性分析`
- 网络路由优化:数据包在多跳网络中的最大传输距离`
- 供应链管理:货物在物流节点间的最大转运范围`