leetcode45:跳跃游戏||
-
给定一个长度为
n
的 0 索引整数数组nums
。初始位置为nums[0]
。每个元素
nums[i]
表示从索引i
向前跳转的最大长度。换句话说,如果你在nums[i]
处,你可以跳转到任意nums[i + j]
处:-
0 <= j <= nums[i]
-
i + j < n
返回到达
nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达nums[n - 1]
。示例 1:
输入: nums = [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4] 输出: 2
提示:
-
1 <= nums.length <= 104
-
0 <= nums[i] <= 1000
-
题目保证可以到达
nums[n-1]
-
步骤1:问题分析与性质定义
计算问题的性质: 这个问题的本质是一个最优路径问题,我们需要找到从数组的起始位置(nums[0]
)跳到数组最后一个元素的最小跳跃次数。
输入输出条件:
- 输入是一个长度为
n
的整数数组nums
,nums[i]
表示从索引i
可以向右跳的最大距离。 - 输出是到达数组最后一个位置(
nums[n-1]
)的最少跳跃次数。
限制条件:
- 数组的长度
n
最大为 10000,元素值范围是 0 到 1000,题目保证可以到达最后一个位置。
潜在的边界条件:
- 最小规模的情况:当
n == 1
时,不需要跳跃,答案是 0。 - 当
nums[0]
为0
时,如果数组长度为 1,可以直接返回 0,否则题目保证可以到达终点。 - 元素为大数的情况:例如
nums[i]
是接近于 1000 的值,需要确保跳跃能覆盖最大范围。
步骤2:算法分解与设计思路
为了寻找从起点到终点的最小跳跃次数,最佳的方法是使用 贪心算法,因为贪心算法能够在每一步作出局部最优的选择,从而达到全局最优。
贪心算法的基本思想:
- 在当前位置,尝试能跳跃到的最远位置,并更新跳跃次数。
- 维护一个当前步的最远可达范围,每当到达该范围时,增加一次跳跃。
- 继续扩展跳跃范围,直到覆盖终点。
贪心算法详细步骤:
- 初始化三个变量:
jumps
(记录跳跃次数)、current_end
(当前这一步可以到达的最远范围)和farthest
(在所有可能的跳跃中能到达的最远位置)。 - 从
0
到n-2
遍历数组:- 对于每个位置
i
,计算能到达的最远位置farthest
。 - 如果当前遍历位置
i
达到了current_end
,则必须增加一次跳跃,并更新current_end
为farthest
。
- 对于每个位置
- 当遍历完数组并且
current_end
达到了最后一个位置时,返回jumps
。
算法的时间复杂度与空间复杂度:
- 时间复杂度:
O(n)
。只需要遍历数组一次,因此是线性时间复杂度。 - 空间复杂度:
O(1)
。只用了常数空间。
为什么贪心算法是最优的: 贪心算法在每一步都确保能跳到最远的位置,这种局部最优解的选择能保证最终到达终点时所用的步数最少。动态规划虽然也可以解决此问题,但时间复杂度较高(O(n^2)
),而分治法的实现复杂度更高,因此贪心算法是本题的最优选择。
步骤3:C++代码实现
代码解析:
- 我们定义了三个变量
jumps
、current_end
和farthest
分别代表跳跃次数、当前跳跃能到达的最远位置以及全局最远能到达的位置。 - 遍历数组时,在每个位置
i
计算能跳到的最远位置(即i + nums[i]
),并更新farthest
。 - 每次遍历到
i == current_end
位置时,表示需要增加一次跳跃,且跳跃范围更新为farthest
,直到覆盖终点。
步骤4:解题启发与优化
通过这个问题可以获得以下启发:
-
贪心算法在路径规划问题中的应用: 贪心算法可以有效解决很多最优路径问题。关键在于如何定义“局部最优”,在本题中,局部最优就是每一步跳跃时能到达的最远位置。
-
算法效率优化: 使用贪心算法将时间复杂度降低到
O(n)
,相比动态规划(O(n^2)
)有明显的效率提升。在大规模数据集上,贪心算法的效率优势非常明显。 -
跳跃次数问题的拓展: 类似的跳跃次数问题可以拓展到多个维度(如二维或三维空间中的最优路径),这种问题可以在图论或路径搜索问题中广泛应用。
步骤5:实际生活中的应用
实际应用场景: 在实际生活中,类似的跳跃问题可以应用于 通信网络中的路由优化。例如在移动通信网络中,如何从一个节点(起点)传递数据包到另一个节点(终点),并且要求最少的跳跃次数(即经过最少的中转站)。这种问题类似于我们从 nums[0]
到 nums[n-1]
的跳跃问题。
实现示例: 在通信网络中,每个路由节点类似于数组中的索引,每个节点的信号覆盖范围类似于 nums[i]
的值。贪心算法可以用来选择最优路径,在传递数据包时,选择能覆盖最远节点的中转站,从而减少中转次数,提升网络传输效率。
这种优化算法可以大幅提升通信网络的效率,减少数据包传递的延迟时间,并且能够处理大规模的网络结构。这在5G网络和物联网(IoT)等领域有着广泛的应用前景。