LeetCode45-跳跃游戏II

题目链接

英文链接:https://leetcode.com/problems/jump-game-ii/

中文链接:https://leetcode-cn.com/problems/jump-game-ii/

题目详述

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

1
2
3
4
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

说明:

假设你总是可以到达数组的最后一个位置。

题目详解

贪心算法,关键在于怎么贪能达到最优。

  • 按跳数来划分区间,跳 0 次有一个区间,也就是数组第一个元素;跳 1 次也有一个区间,它是由前面一个区间得到的;依此类推。
  • 每次用当前区间得到下一个区间,并更新跳数。
  • 遍历过程中如果发现区间右边界已经到达或越过数组最后一个元素,就可以返回了。
  • 因为题目保证可以到达数组的最后一个位置,所以不用额外判断。实际上,当我们用当前区间不能得到下一个区间时,即 r == maxR,说明不能跳到最后一个位置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class LeetCode_00045 {

public int jump(int[] nums) {
if (nums == null || nums.length < 2) {
return 0;
}
int step = 0;
int l = 0, r = 0;
while (l <= r) {
++step;
int maxR = 0;
for (int i = l; i <= r; ++i) {
maxR = Math.max(maxR, i + nums[i]);
}
if (maxR >= nums.length - 1) {
return step;
}
l = r + 1;
r = maxR;
}
return step;
}
}