题目描述
思路解析动画文字版
在每一格都枚举「跳 1 步、跳 2 步…」一路递归试到底,路径会指数爆炸,还会反复算同一格能不能到终点。其实根本不必关心怎么跳。
转折:从左往右扫,只要一个格子在 maxReach 范围内能站住,它能到的地方我就也能到。所以每到一格就用 maxReach = max(maxReach, i + nums[i]) 把边界往外推。一旦 maxReach 盖过终点就成;要是走到某格时 i 已经超出 maxReach,说明这格根本站不上去,卡死返回 false。贪心成立的关键:能到的范围是连续的一段,维护它的右边界就行。
i=0 (值2):站在 0 号位能跳 2 步,最远摸到 2 号位。橙色区间就是当前你够得着的范围 [0, 2]。
i=1 (值3):1 号位在可达范围内(1 ≤ 2),站得上去。它能跳 3 步到 4 号位,maxReach 被推到 4——已经盖住终点了,但我们把扫描走完看看每步怎么动。
i=2 (值1):2 号位也在范围内。它只能跳 1 步到 3 号位,比现有的 4 近,maxReach 不更新,仍是 4。
i=3 (值1):3 号位还在范围内,它能到的 4 号位也没超过现有边界。maxReach 保持 4。
i=4 · 已是终点:走到最后一格 4,它本身就在可达范围内(4 ≤ maxReach=4)。能到达,返回 true。
负例:换成 [3,2,1,0,4]:换个会失败的数组 [3,2,1,0,4]。0 号位跳 3 步,maxReach=3,范围 [0,3]——终点 4 还差一格够不到。
负例 i=1 (值2):1 号位在范围内,它能到 1+2=3,没超过现有边界,maxReach 不动,还是 3。范围卡在 [0,3] 里推不出去。
负例 · 卡在 0:一路走到 3 号位,它的值是 0,3+0 还是 3,maxReach 推不动了。下一步 i=4 时 4 > maxReach=3,站不上去 → 返回 false。一个 0 卡在关键位置就能堵死整条路。
不纠结具体怎么跳、跳几次,只维护全局的「可达右边界」maxReach,让它一路向外推——这就是可达性贪心。
迁移阶梯:把这题练到能复述后,再去同类题里迁移:先复用状态定义,再调整边界条件。
边界三连:边界三连:极端输入先过一遍。
几个高频追问,记住答法。
参考代码
class Solution: def canJump(self, nums): maxReach = 0 for i, jump in enumerate(nums): if i > maxReach: return False maxReach = max(maxReach, i + jump) return True复杂度
- 时间复杂度:O(n),只从左到右扫一遍,每格做常数次比较
- 空间复杂度:O(1),只用 maxReach 一个变量,不存路径
可套用的代码模板
记牢:维护 maxReach(最远可达下标);i > maxReach 即卡死返回 False;maxReach 盖住终点即 True。
Python
# 可达边界贪心 骨架maxReach = 0for i, x in enumerate(nums): if i > maxReach: # 当前下标已超出能到的最远 → 卡死 return False maxReach = max(maxReach, i + x) if maxReach >= len(nums) - 1: # 已能盖住终点,提前结束 return Truereturn True易错点
面试追问把动画讲成自己的话
追问为什么维护「最远可达」就够?
追问和「跳跃游戏 II(最少步数)」区别?
追问复杂度?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
跳跃游戏 II
LeetCode 45 · 中等 · 沿着 贪心 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题