数据结构与算法之 leetcode 贪心算法跳跃游戏极限 贪心最远距离

数据结构与算法阿木 发布于 2025-07-12 6 次阅读


摘要:

跳跃游戏极限问题是一道经典的LeetCode算法题,它考察了贪心算法的应用。本文将围绕这一主题,详细解析跳跃游戏极限问题的背景、贪心算法的原理,并通过具体的代码实现来展示如何运用贪心算法解决这一问题。

一、背景介绍

跳跃游戏极限问题(LeetCode 45)描述如下:

给定一个非负整数数组nums,你最初位于数组的第一个位置。每次跳跃你可以跳到下一个或前一个索引处。如果你到达索引为n-1的地方,则认为你已经跳到了数组最后一个位置。你的目标是最大程度地增加你跳跃的次数。

示例:

输入:nums = [2,3,1,1,4]

输出:2

解释:你可以先跳1步,从索引0跳到索引1,然后跳3步到达最后一个位置。

二、贪心算法原理

贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。在跳跃游戏极限问题中,贪心算法的核心思想是每次跳跃都尽可能跳到最远的位置,从而保证在后续的跳跃中能够有更多的选择。

三、代码实现

以下是一个使用贪心算法解决跳跃游戏极限问题的Python代码实现:

python

def jump(nums):


n = len(nums)


if n <= 1:


return 0

max_reach = 0 当前能到达的最远位置


step = 0 跳跃次数


for i in range(n):


if i > max_reach:


return -1 如果当前位置超出了当前能到达的最远位置,则无法继续跳跃


max_reach = max(max_reach, i + nums[i]) 更新当前能到达的最远位置


if max_reach >= n - 1:


return step + 1 如果当前能到达的最远位置已经到达或超过最后一个位置,返回跳跃次数


step += 1 增加跳跃次数

return -1 如果无法到达最后一个位置,返回-1

测试代码


nums = [2, 3, 1, 1, 4]


print(jump(nums)) 输出:2


四、代码解析

1. 初始化`max_reach`变量,用于记录当前能到达的最远位置。

2. 初始化`step`变量,用于记录跳跃次数。

3. 遍历数组`nums`,对于每个位置`i`:

- 如果`i`超出了当前能到达的最远位置`max_reach`,则返回-1,表示无法继续跳跃。

- 更新`max_reach`为当前位置`i`加上`nums[i]`,即当前能到达的最远位置。

- 如果`max_reach`已经到达或超过最后一个位置`n-1`,则返回`step + 1`,即跳跃次数加1。

- 增加跳跃次数`step`。

4. 如果遍历结束后无法到达最后一个位置,则返回-1。

五、总结

本文通过分析跳跃游戏极限问题,介绍了贪心算法的原理,并给出了一种使用贪心算法解决该问题的代码实现。通过贪心算法,我们可以在每一步都做出最优的选择,从而在整体上得到最优解。在实际应用中,贪心算法是一种简单而有效的算法策略,适用于解决许多优化问题。