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