力扣45-跳跃游戏II (java详细题解)

题目链接:45. 跳跃游戏 II - 力扣(LeetCode)

前情提要:

建议大家在做本题前先将力扣55-跳跃游戏先做了,具体题解在这 力扣55-跳跃游戏(java详细题解)-CSDN博客

因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。

贪心方法:局部最优推出全局最优。

如果一个题你觉得可以用局部最优推出全局最优,并且没有反例来反驳的话就可以用贪心来试试。

题目思路:

本题相对于力扣45要难上不少,因为本题是求到达最后一个元素的最小跳跃次数。

大家肯定也会纠结,第一步怎么跳,第二步怎么跳。

与其纠结于每一步怎么跳,我们可以换一个维度。其实跟力扣45一个思路,用每一步的覆盖范围来做。

本题的关键:以最小的步数增加覆盖范围,一旦覆盖范围到了终点那么直接返回步数。

但跟力扣45不同的是,这里我们要维护俩个覆盖范围,一个是当前这一步的最大覆盖范围,另一个是下一步的最大覆盖范围。

关键思路:当遍历到本步所能到的最大覆盖范围后,还没有到达最终点,此时我们就不得不走下一步,走一下步时,我们更新本步的最大覆盖范围,如果覆盖范围超过终点,则直接返回步数,该步数就是最小的步数。

最终代码:

java 复制代码
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;
    }
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

相关推荐
Java中文社群7 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心7 小时前
从零开始学Flink:数据源
java·大数据·后端·flink
间彧7 小时前
Spring Boot项目中如何自定义线程池
java
间彧7 小时前
Java线程池详解与实战指南
java
用户298698530147 小时前
Java 使用 Spire.PDF 将PDF文档转换为Word格式
java·后端
NAGNIP7 小时前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo8 小时前
半开区间和开区间的两个二分模版
算法
渣哥8 小时前
ConcurrentHashMap 1.7 vs 1.8:分段锁到 CAS+红黑树的演进与性能差异
java
moonlifesudo8 小时前
300:最长递增子序列
算法
间彧8 小时前
复用线程:原理详解与实战应用
java