图解题库 / 贪心

45. 跳跃游戏 II

中等 含交互动画

学完这道你应该能: 说清它为什么用「贪心」,而不是死记步骤; 合上页面,自己默写出核心代码; 用 30 秒把思路讲清楚。

题目描述

nums[i] 是从 i 最多能跳的步数,求从 0 跳到末尾的最少跳跃次数

nums = [2, 3, 1, 1, 4]
输出 = 2 (0→1→4)

思路解析

把「跳跃」想成 BFS 分层:当前这一跳能覆盖一段范围 [..end]。在这段里走时,不断更新「下一跳最远能到 farthest」。一旦走到 end,就必须再跳一次,把 end 推到 farthest。

i=0 · 第一跳范围:在 0 处,下一跳最远能到 0+2=2。i 正好等于当前边界 end=0,必须跳一次:jumps=1,新边界 end=2。

i=1 · 更新最远:在边界 [0,2] 内走到 1,它能跳到 1+3=4,刷新 farthest=4。还没到 end,先不加跳数。

i=2 · 到达边界:走到 i=2,正好是当前边界 end=2,必须再跳一次:jumps=2,新边界 end 推到 farthest=4。

end ≥ 末尾 · 完成:新边界 end=4 已经盖住终点(下标 4),不用再跳了。最少跳跃次数 = 2

不纠结具体跳到哪格,只盯「这一跳范围内能把下次边界推多远」——这是区间贪心,也是隐式 BFS 分层。

参考代码(Python)

Python
1jumps, end, farthest = 0, 0, 0
2for i in range(len(nums) - 1):        # 不用看最后一格
3    farthest = max(farthest, i + nums[i])
4    if i == end:                      # 走到当前跳的边界
5        jumps += 1; end = farthest    # 必须跳,边界推到最远
6return jumps

复杂度分析

  • 时间复杂度:O(n) —— 一遍扫描
  • 空间复杂度:O(1) —— 三个变量

套路模板

记住骨架:farthest 持续更新、i 撞到 end 就 cnt+1 并把 end 推到 farthest。最少跳数、覆盖区间、视频拼接都是这套。

Python
1cnt, end, farthest = 0, 0, 0
2for i in range(n - 1):
3    farthest = max(farthest, i + reach(i))
4    if i == end:                      # 到边界,必须推进一层
5        cnt += 1; end = farthest
6return cnt

易错点

  • 循环到最后一格 → ✅ 只到 n-2(到末尾时若 i==end 会多算一跳)
  • 一进范围就立刻跳 → ✅ 到 i==end 才跳(要把这一跳范围内的最远潜力都看完)

以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握

下一题 →1049. 最后一块石头 II ← 返回题库