45. 跳跃游戏 II
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
简单介绍:
难度:困难
使用语言:JAVA。
这道题来自leetcode题库的贪心算法标签。
解题思路:
首先看题、分析题意:
- 一定可以到达终点
- 要求步数最少
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题
数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
无特殊数据结构
算法1 - 反向查找:
- 因为一定可以到达数组尾部,所以以尾部为起点,向前查找跳跃点。
- 从后往前遍历,每次选取能到达最小下标的位置。
- 更新 position 的值,记录 step,只要 position <= 0 则结束
代码:
class Solution {
public int jump(int[] nums) {
int position = nums.length - 1;
int steps = 0;
while (position > 0) {
for (int i = 0; i < position; i++) {
if (i + nums[i] >= position) {
position = i;
steps++;
break;
}
}
}
return steps;
}
}
算法2 - 正向查找:
- 正向查找,每次找到可以跳跃的最远距离
- 维护当前能够到达的最大下标位置 maxPosition,记为边界 end。我们从左到右遍历数组,只有在到达边界时,才更新边界并将跳跃次数增加 1。
代码:
class Solution {
public int jump(int[] nums) {
int length = nums.length;
int end = 0;
int maxPosition = 0;
int steps = 0;
for (int i = 0; i < length - 1; i++) {
maxPosition = Math.max(maxPosition, i + nums[i]);
if (i == end) {
end = maxPosition;
steps++;
}
}
return steps;
}
}