8.6跳跃游戏②(LC45-M)

算法:

与上一题一样,还是看最大覆盖范围

要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!

这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖

如果移动下标达到了当前这一步的最大覆盖最远距离了,还没有到终点的话,那么就必须再走一步来增加覆盖范围,直到覆盖范围覆盖了终点。

正确代码:

复制代码
class Solution {
    public int jump(int[] nums) {
        if (nums==null || nums.length == 0 || nums.length == 1){
            return 0;
        }
        //记录跳跃的次数
        int count = 0;
        //当前的覆盖最大区域
        int curdistance = 0;
        //最大的覆盖区域
        int maxdistance = 0;
        for (int i=0; i<nums.length;i++){
            maxdistance = Math.max(maxdistance, i+nums[i]);
//若当前已达终点
            if (maxdistance>=nums.length-1){
                count++;
                break;
            } 
//若未达终点,且走到当前这步的最大覆盖范围,更新下一步可达的最大区域
            if (i==curdistance){
                curdistance = maxdistance;
                count++;
            }
            
        }
        return count;

    }
}

注意:

1.if的条件是 maxdistance>=nums.length-1

是 maxdistance而不是curdistance

索引最大是nums.length-1,一定要减一!

复制代码
//说明当前一步,再跳一步就到达了末尾
            if (maxdistance>=nums.length-1){
                count++;
                break;
            } 

`maxdistance` 变量用于记录从当前位置可以到达的最远索引。随着算法在数组中的迭代,该变量会被更新。

`maxdistance` 大于或等于 `nums.length - 1` 时,意味着当前位置可以到达数组的末尾或者末尾之后的位置。在这种情况下,算法会增加 `count` 并且跳出循环,因为它已经找到了一条到达末尾的路径。

时间空间复杂度:

  • 时间复杂度: O(n)。n是数组长度。
  • 空间复杂度: O(1)
相关推荐
Yzzz-F2 小时前
Problem - 2205D - Codeforces
算法
智者知已应修善业3 小时前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
Halo_tjn3 小时前
Java Set集合相关知识点
java·开发语言·算法
生成论实验室4 小时前
《事件关系阴阳博弈动力学:识势应势之道》第四篇:降U动力学——认知确定度的自驱演化
人工智能·科技·神经网络·算法·架构
AI科技星4 小时前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
科研前沿5 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨5 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
晨曦夜月5 小时前
map与unordered_map区别
算法·哈希算法
qeen875 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码6 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻