1. 问题背景与核心挑战
跳跃游戏2是力扣题库中一道经典的贪心算法题目(编号45,原输入有误已修正),题目描述如下:给定一个非负整数数组nums,初始位于数组的第一个下标,每个元素代表在该位置可以跳跃的最大长度,求到达最后一个位置的最少跳跃次数。
这道题之所以被归类为贪心算法,是因为它要求我们在每一步做出局部最优选择,即"在当前能跳到的范围内,选择能跳得最远的位置"。这与现实中的很多决策场景类似——我们无法预知未来所有信息,只能基于当前掌握的情况做出最优判断。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 贪心算法设计思路解析
2.1 关键问题拆解
解决这个问题的核心在于理解三个关键变量:
- 当前能到达的最远位置(current_end)
- 下一步能到达的最远位置(max_far)
- 跳跃次数(jumps)
每次当我们到达current_end时,就说明需要进行一次跳跃,此时将current_end更新为max_far,表示这是新的边界。这种"边界推进"的思想是贪心算法的典型应用。
2.2 算法流程详解
- 初始化jumps=0,current_end=0,max_far=0
- 遍历数组(注意不需要遍历最后一个元素):
- 更新max_far = max(max_far, i + nums[i])
- 当i == current_end时:
- jumps += 1
- current_end = max_far
- 如果current_end >= 末尾索引,提前返回
- 返回jumps
这个算法的时间复杂度是O(n),因为我们只需要一次线性扫描;空间复杂度是O(1),只使用了常数个额外变量。
3. 代码实现与逐行解析
python复制def jump(nums):
n = len(nums)
if n <= 1:
return 0
jumps = 0
current_end = 0
max_far = 0
for i in range(n - 1): # 不需要遍历最后一个元素
max_far = max(max_far, i + nums[i])
if
