1. 问题解析与贪心算法基础
跳跃游戏II是力扣经典贪心算法题目(编号45),题目要求给定一个非负整数数组nums,数组中的每个元素代表你在该位置可以跳跃的最大长度。初始位置为数组的第一个下标,目标是使用最少的跳跃次数到达数组的最后一个位置。
这个问题看似简单,实则暗藏玄机。我们先看一个具体例子:
code复制输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃次数是2。
从下标0跳到下标1,然后跳到最后一个下标。
贪心算法在此问题中的核心思想是:在每一步跳跃时,都选择能够使得"下一步能跳得最远"的位置。这种局部最优的选择,最终会导向全局最优解。这与动态规划不同,贪心算法不需要保存所有子问题的解,因此通常具有更好的空间复杂度。
注意:题目保证可以到达最后一个位置,所以不需要考虑无法到达的情况。但在实际面试中,建议先确认这一点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与关键步骤
2.1 双指针贪心实现
最优雅的解决方案是使用双指针法,时间复杂度O(n),空间复杂度O(1)。以下是核心思路:
-
维护三个关键变量:
jumps:记录跳跃次数current_end:当前跳跃能到达的最远位置farthest:所有可能位置中能到达的最远位置
-
遍历数组时(不包括最后一个元素):
- 不断更新
farthest - 当到达
current_end时,必须进行一次跳跃,并更新current_end为farthest
- 不断更新
python复制def jump(nums):
jumps = 0
current_end = 0
farthest = 0
for i in range(len(nums)-1): # 不需要检查最后一个位置
farthest = max(farthest, i + nums[i])
if i == current_end:
jumps += 1
current_end = farthest
if current_end >= len(nums)-1:
