题目描述
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 才跳(要把这一跳范围内的最远潜力都看完)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。