图解题库 / 贪心

55. 跳跃游戏

中等 含交互动画

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

题目描述

每个格子的数字是最多能往右跳几步,从 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] 是步数,要加上当前下标)

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

下一题 →75. 颜色分类 ← 返回题库