算法练习——跳跃游戏II
1.题目描述
给定一个长度为 n
的 0 索引整数数组 nums
。初始位置在下标 0。
每个元素 nums[i]
表示从索引 i
向后跳转的最大长度。换句话说,如果你在索引 i
处,你可以跳转到任意 (i + j)
处:
0 <= j <= nums[i]
且i + j < n
返回到达 n - 1
的最小跳跃次数。测试用例保证可以到达 n - 1
。
示例 1:
输入: nums = [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳3步到达数组的最后一个位置。
示例 2:
输入: nums = [2,3,0,1,4] 输出: 2
2.解题思路
本题使用了“贪心算法”的思想,每次跳跃都选择能到达的最远距离,从而保证用最少的步数覆盖最大的范围。
- 记录 当前跳跃能到达的最远边界(currentEnd):在当前跳跃步数内,能到达的最远位置。
- 记录 所有可达位置中能跳的最远位置(farthest):在当前跳跃的覆盖范围内,遍历每个位置时,更新下一步能到达的最远位置。
- 当遍历到当前跳跃的边界(
i == currentEnd
)时,必须进行一次跳跃,此时将currentEnd
更新为farthest
(下一步的最远边界),同时跳跃次数加 1。
3.代码分析
func jump(nums []int) int {n := len(nums)if n == 1 {return 0}jump := 0currentEnd := 0fastest := 0for i := 0; i < n - 1; i++ {if i + nums[i] > fastest {fastest = i + nums[i]}if i == currentEnd {jump++currentEnd = fastest}if currentEnd >= n-1 {break}}return jump
}