LeetCode 45. 跳跃游戏 II [Hot 100] —— 贪心
已解答
中等
给定一个长度为 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]
输出: 2class Solution {
public int jump(int[] nums) {
int cnt = 0;
int curRight = 0;
int nextRight = 0;
for (int i = 0; i < nums.length - 1; i++) { // 维护
nextRight = Math.max(nextRight, i + nums[i]); // 维护下一个最远值
if (i == curRight) { // 到达现在最远值,跳
cnt++;
curRight = nextRight;
if (curRight >= nums.length -1) break;
}
}
return cnt;
}
}因为到达最后一个位置就不需要再跳了,所以循环条件是 i < nums.length - 1
贪心(BFS 思想)
我们可以用贪心在 O(n) 时间内解决。
思路:
- 维护当前能到达的最远位置
maxPos,以及当前跳跃的边界end。 - 遍历数组,更新
maxPos。 - 当遍历到当前边界
end时,表示必须再跳一次,此时更新end为maxPos,跳跃次数 +1。
算法步骤
初始化:
jumps = 0(跳跃次数)maxPos = 0(当前能到达的最远位置)end = 0(当前跳跃能到达的边界)
遍历
i从0到n-2(因为到达最后一个位置后不需要再跳):- 更新
maxPos = max(maxPos, i + nums[i]) 如果
i == end:jumps++end = maxPos- 如果
end >= n-1可以提前结束
- 更新
- 返回
jumps
版权申明
本文系作者 @xiin 原创发布在To Future$站点。未经许可,禁止转载。
暂无评论数据