持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
疯狂星期四了,但是今天开了一天的会,睡也没睡好
跳跃游戏 II
该题出自力扣的45题 —— 跳跃游戏 II【中等题】,是昨天题型的升级版,应该是会困难一些,加上一些变形
审题
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 假设你总是可以到达数组的最后一个位置。
- 这道题与昨天做得跳跃游戏相似,不过昨天的是计算是否能够到达最后一个位置。今天这道题是默认用例都能够到达最后一个位置,但是需要最优路线,也就是最小跳跃次数
- 可以使用贪心的做法,做最小跳跃次数,每次做当前步数的最大步数,和下一步数的最大步数
- 定义三个变量,分别是当前的最大能跳跃位置,最大的跳跃位置,需要的步数
- 遍历数组,每次把可以跳跃的最大位置赋值到最大变量
- 判断如果最大变量可以到达最后的位置,则步数加一直接返回
- 如果已经走到设置的步数变量,则赋值到最大=跳跃位置,步数加一
- 当前可移动距离尽可能多走,如果还没到终点,步数再加一。整体最优:一步尽可能多走,从而达到最小步数。
- 如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。
编码
class Solution {
public int jump(int[] nums) {
if (nums.length == 1)return 0;
int cur = 0,maxCur = 0, step = 0;
for (int i = 0; i < nums.length; i++) {
maxCur = Math.max(maxCur,i + nums[i]);
if (maxCur >= nums.length - 1)return step + 1;
if (i == cur){
step++;
cur = maxCur;
}
}
return step;
}
}