题目描述
每个格子的数字是最多能往右跳几步,从 0 号位出发,能否到达最后一格?
nums = [2, 3, 1, 1, 4]
输出 = true
思路解析
从左往右走,每到一个能到的格子就更新一下「最远可达」。如果某个格子超出了最远可达,那就卡住了;如果最远可达盖过了终点,那就成了。
i=0 (2):站在 0 号位能跳 2 步,最远到 2 号位。橙色区间就是目前你够得着的范围。
i=1 (3):1 号位在可达范围内,它能跳 3 步到 4 号位。最远可达更新成 4——直接盖住终点了!
已够到终点:最远可达 4 ≥ 最后一格下标 4,能到达,返回 true。后面就不用看了。
如果是 [3,2,1,0,4]:走到 3 号位时最远可达只有 3,而 3 号位值是 0 跳不动,4 号位永远够不着——返回 false。
反例 i=0 (3):再换个失败的例子 [3,2,1,0,4]。0 号位能跳 3 步,最远到 3 号位(橙色范围)。
反例 · 卡在 0:一路走到 3 号位,它的值是 0 跳不动,最远可达停在 3。终点下标 4 超出范围 → 返回 false。
不用纠结具体怎么跳,只维护全局最优的「可达边界」——这就是贪心。
参考代码(Python)
Python
1def canJump(self, nums):
2 maxReach = 0
3 for i in range(len(nums)):
4 if i > maxReach: return False # 卡住了
5 maxReach = max(maxReach, i + nums[i])
6 if maxReach >= len(nums)-1: return True
7 return True复杂度分析
- 时间复杂度:O(n) —— 只扫一遍
- 空间复杂度:O(1) —— 一个变量
套路模板
维护一个「最远可达边界」,遍历时实时更新,越界就停——跳跃游戏 II、加油站都是它的亲戚。
Python
1# 「能否到达 / 最远能到」一遍扫描都套
2reach = 0
3for i in range(n):
4 if i > reach: return False # 当前格已够不到,卡住
5 reach = max(reach, i + nums[i]) # 更新最远边界
6 if reach >= n - 1: return True
7return True易错点
- ❌ 不判断 i 是否已超出 reach → ✅ 循环里先 if i > reach: return False(否则会更新一个根本到不了的格子)
- ❌ 把「能跳几步」当成「跳到哪」 → ✅ 最远位置是 i + nums[i](nums[i] 是步数,要加上当前下标)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。