力扣45-跳跃游戏II (java详细题解)
题目链接:45. 跳跃游戏 II - 力扣(LeetCode)
前情提要:
建议大家在做本题前先将力扣55-跳跃游戏先做了,具体题解在这 力扣55-跳跃游戏(java详细题解)-CSDN博客。
因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。
贪心方法:局部最优推出全局最优。
如果一个题你觉得可以用局部最优推出全局最优,并且没有反例来反驳的话就可以用贪心来试试。
题目思路:
本题相对于力扣45要难上不少,因为本题是求到达最后一个元素的最小跳跃次数。
大家肯定也会纠结,第一步怎么跳,第二步怎么跳。
与其纠结于每一步怎么跳,我们可以换一个维度。其实跟力扣45一个思路,用每一步的覆盖范围来做。
本题的关键:以最小的步数增加覆盖范围,一旦覆盖范围到了终点那么直接返回步数。
但跟力扣45不同的是,这里我们要维护俩个覆盖范围,一个是当前这一步的最大覆盖范围,另一个是下一步的最大覆盖范围。
关键思路:当遍历到本步所能到的最大覆盖范围后,还没有到达最终点,此时我们就不得不走下一步,走一下步时,我们更新本步的最大覆盖范围,如果覆盖范围超过终点,则直接返回步数,该步数就是最小的步数。
最终代码:
class Solution {
public int jump(int[] nums) {
//该题的关键就是 以最小的步数增加覆盖范围 一旦覆盖范围到了终点那么直接返回步数
//本题就是要维护俩个范围 一个是当前这一步最大覆盖范围 另一个就是下一步的最大覆盖范围
//只要我遍历的元素到了我当前这一步的最大范围 还没有到终点 就直接将步数加一 因为我还要跳下一步才可能到达终点
//当前最大覆盖范围
int currange = 0;
//下一步的最大覆盖范围
int nextrange = 0;
//记录的结果
int result = 0;
//当数组的数量为1,那么直接返回0
if(nums.length == 1)return 0;
for(int i = 0;i < nums.length;i ++){
nextrange = Math.max(i + nums[i],nextrange);
if(currange == i){
//只要我遍历的元素到了我当前的最大覆盖范围 而且没有到达终点 步数就加一
if(currange != nums.length - 1){
result ++;
//更新我这一步能到的最大覆盖范围
currange = nextrange;
//此时如果现在这一步已经超过终点的话 就可以直接结束循环了
if(currange >= nums.length - 1){
break;
}
}
}
}
return result;
}
}
这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。
我很乐意为你解答。那么我们下篇再见!