IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode.1893题.检查是否区域内所有整数都被覆盖 -> 正文阅读

[数据结构与算法]LeetCode.1893题.检查是否区域内所有整数都被覆盖

一、算法详解

1、心历路程

今年暑假,研一下册结束了,这学期肝了一篇论文出来。准备再在此论文基础上改一下,丰富一下实验,拿来作为毕业设计的底子。其实论文做的还可以,可以拆成两篇小论文,拿去做毕业设计问题不大吧(骄傲了,罚站)。
先上图,为找工作准备数据结构知识。想给自己数据结构开个头。第一次刷算法题,点了第一个通过率较高的算法题,感觉很挫折。
志斌师兄几分钟就做完了,他给我讲了他的想法,我感觉挺好的,思路很快很清晰。上面的论文能出来,也靠志斌师兄给我搞了好久的环境,谈论了一下论文思路,不然我可能已经放弃了(真心感谢)。但是不知道为什么我就是喜欢转牛角尖,不想有太高的空间复杂度。结果搞了2个小时,还好终于完成了。
在这里插入图片描述

2、源代码

class Solution {
    boolean flag = true;
    public boolean fn(int[][] ranges, int left, int right)
    {
        if(left == right + 1)
            return true;
        boolean b = false;
        for (int i = 0; i < ranges.length; i++) {
            if(left<ranges[i][0] && ranges[i][0]<=right && right <= ranges[i][1])
                right = ranges[i][0] -1;
            else if(left >= ranges[i][0] && right <= ranges[i][1])
                left = right + 1;
            else if(left >= ranges[i][0] && left <= ranges[i][1] && right > ranges[i][1])
                left = ranges[i][1] + 1;
            else if(left < ranges[i][0] && right > ranges[i][1]){
                flag = flag && fn(ranges,left,ranges[i][0]-1);
                return flag && fn(ranges,ranges[i][1]+1,right);
            }
            b = b || left == right + 1;
        }
        return b;
    }
    public boolean isCovered(int[][] ranges, int left, int right) {
        return fn(ranges, left, right);
    }
}

3、思路详解

原题内容在这就不写了,错了好几次,就是没理解透里面的细节。

A) 理论思想

  1. 常见数学分析法
  2. 有序表快速匹配
  3. 多递归思想
  4. 其他细节

B) 应用思想

1.常见数学分析法
这个问题可以看成是两个数组的匹配问题,所以可以分为6种情况。

细节1:数组的列只有两列,即start,end列,这也是减少运算时间的关键。
a)right < ranges[i][1]
b)left < ranges[i][0] && right >= ranges[i][0] && right <= ranges[i][1]
c)left >= ranges[i][0] && right <= ranges[i][1]
注:left <= right这是给定条件
d)left >= ranges[i][0] && left <= ranges[i][1] && right > ranges[i][1]
e)left > ranges[i][1]
f)left < ranges[i][0] && right >ranges[i][1]
注:除了f情况,其他的都可以分割成未匹配数组,而f情况会分割出两个数组,此时就需要就必须用到多递归思想了。

  1. 有序表快速匹配
    因为数组里面的元素都是有序的,所以每一次匹配都根据start、end对应left、right,然后快速分割出来未能匹配上的“数组”,这也是快速匹配的原因所在。
    在a、e情况中,数组都未能部分匹配成功,所以不用做任何处理。
    b:部分匹配成功,将right=ranges[i][0]-1,分割出未能匹配部分,进入下一次匹配。
    c:全部匹配成功,将left=right+1,达到匹配成功条件left==right+1,然后return true。
    d:部分匹配成功,将left = ranges[i][1]+1。
  2. 多递归思想
    在f情况中,分割出了两个数组,此时无法在进入for循环,所有需要分别递归进入匹配。
    ※※※特别注意
    A)这里还可以加快速度,将fn()再传入一个point变量,这个point指向已经匹配了的行,第一次进入的时候设为0。这样可以更快。我就不改了,写博客还是可以,整理整理新思路就来了。
    B)可以使用三目运算符来代替if、else。为什么三目运算符比if、else的效率更高?这里更if、else的处理方式和CPU的处理模式有关。
    CPU将一系列的指令存入一个队列中,CPU通过顺序执行这个队列中的所有指令来做到快速计算。对于if、else,CPU根据判断条件将一种指令序列排序,但是如果世界不满足条件,那就得把排好的指令队列清空,重新把其他指令排在后面,此时就需要把刚才排好的队列清空,这种预测错误的惩罚将导致CPU处理时间变得更长。
    对于三目运算符,CPU会把判断true和false下的指令都进行排队计算,然后再通过判断来选择那个结果,虽然计算量变大,但是对于CPU来说,计算就是最擅长的事。虽然if、else通过判断后只计算一种判断方向的指令,但是得到的惩罚时间反而大于全部指令执行的时间。
    4.其他细节
    这里的其他细节就不详记录了,都是一些基础,可以通过阅读代码自行体会,如递a)归结出口b)递归返回等等。

4、总结

谈到算法,还是得看看它的评估标准时间、空间复杂度。
1、时间复杂度:这个与输入的二维数组ranges有关,如果二维数组有n行,那么最坏时间复杂度为O(n)。
2、空间复杂度:显而易见,该空间复杂度为O(1)
3、做算法的感受:感觉算法就是一道数学题,分析拆解问题,转化问题,再结合CPU的处理方式,用高效的代码实现。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-25 00:01:44  更:2021-07-25 00:02:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:41:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码