大家好!我是曾续缘🤖
今天是《LeetCode 热题 100》系列
发车第 79 天
贪心算法第 3 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
跳跃游戏 II 给定一个长度为
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]
解题方法
跳跃游戏 II 是一个经典的贪心算法问题。在这个问题中,我们希望找到到达数组末尾的最小跳跃次数。
解题的关键在于,每一步我们都要做出在当前情况下能跳得最远的选择。
当前情况指每一步能跳的区间中,选择能跳最远的位置。
- 初始化:
n
为数组nums
的长度。mx
表示当前能到达的最远位置。land
表示落脚点。注意不是真正的落脚点,而是最远的落脚点,上一个落脚点和下一个落脚点之间,能到达最远距离的才是真正落脚点。使用land
可以方便的计算跳跃次数。ans
表示到达数组末尾的最小跳跃次数,初始为 0。
- 遍历数组:
- 用一个循环遍历数组,循环变量
i
从 0 开始,一直到mx
。 - 在每次循环中,我们首先检查是否已经到达数组的末尾,如果是,则退出循环。
- 用一个循环遍历数组,循环变量
- 更新最远位置:
- 更新
mx
为mx
和i + nums[i]
中的较大值。这代表我们在这个位置可以跳到的最远距离。
- 更新
- 判断是否到达落脚点:
- 如果
i
等于land
,这意味着我们已经到达了上一个落脚点,因此我们需要更新land
为当前的mx
,并且跳跃次数ans
加一。
- 如果
- 返回结果:
- 循环结束后,
ans
就是我们要求的到达数组末尾的最小跳跃次数。
- 循环结束后,
Code
class Solution {
public int jump(int[] nums) {
int n = nums.length, mx = 0, land = 0, ans = 0; // 初始化变量
for(int i = 0; i <= mx; i++){ // 遍历数组
if(land >= n - 1)break; // 如果已经到达末尾,则结束循环
mx = Math.max(mx, i + nums[i]); // 更新最远能到达的位置
if(i == land){ // 如果到达了落脚点
land = mx; // 更新落脚点到新的最远位置
ans++; // 跳跃次数加一
}
}
return ans; // 返回跳跃次数
}
}