贪心算法能高效解决跳跃游戏问题:Jump Game I通过维护最远可达索引判断是否可达,Jump Game II用分层BFS思想结合currentEnd与farthest求最少跳跃次数,时间复杂度O(n),空间O(1)。

贪心算法在跳跃游戏(Jump Game)中能高效求出“能否到达终点”或“最少跳跃次数”,关键在于每一步都选择当前能到达的最远位置,不回溯、不穷举。
判断是否可达:一次遍历维护最远可达索引
对于 Jump Game I(给定数组 nums,nums[i] 表示从位置 i 最多跳 nums[i] 步),目标是判断能否从索引 0 到达最后一个索引。
- 用变量 maxReach 记录当前能到达的最远下标,初始为 0
- 遍历数组(索引 i 从 0 到 n-1),若 i > maxReach,说明当前位置已不可达,直接返回 false
- 否则更新:maxReach = Math.max(maxReach, i + nums[i])
- 若遍历中 maxReach >= n-1,提前返回 true
求最小跳跃次数:分层 BFS 思想 + 贪心边界推进
Jump Game II 要求最少跳跃步数。虽本质是 BFS,但可用贪心模拟“层”的扩展过程,避免建图和队列开销。
- 维护三个变量:currentEnd(当前跳跃能覆盖的右边界)、farthest(下一步能跳到的最远位置)、jumps(已跳跃次数)
- 遍历 i 从 0 到 n-2(最后位置无需跳)
- 每次更新 farthest = Math.max(farthest, i + nums[i])
- 当 i == currentEnd,说明当前层结束,必须跳一次:jumps++,并令 currentEnd = farthest
- 若 currentEnd >= n-1,可提前终止
为什么贪心在这里成立?关键性质支撑
跳跃游戏的最优子结构允许贪心选择:在能覆盖的范围内,跳得越远,留给后续的选择空间越大,不会因局部保守导致全局步数增加。
立即学习“Java免费学习笔记(深入)”;
- 假设某步没选最远位置,而是跳到中间某个点,那它能覆盖的后续范围一定 ⊆ 选最远点所能覆盖的范围
- 因此,每步取 i + nums[i] 的最大值,等价于 BFS 中拓展下一层的所有节点
- 该策略不依赖未来信息,仅基于当前已知可达范围,时间复杂度稳定为 O(n),空间 O(1)
常见陷阱与调试建议
实际编码时容易忽略边界细节,导致逻辑错误或越界。
- 数组为空或长度为 1 时,直接返回 true 或 0 次跳跃
- Jump Game II 中,不要在 i == n-1 时更新 farthest,否则可能误算额外跳跃
- 更新 currentEnd 后立即检查是否 ≥ n−1,避免多跳一次
- 用小样例手动模拟(如 [2,3,1,1,4])验证每轮 currentEnd 和 farthest 变化



















