leetCode-hot100-数组专题之区间问题

数组专题之区间问题

    • 知识点:
    • 解决思路:
    • 例题
      • 56.合并区间
      • 57.插入区间
      • 253.会议室 Ⅱ
      • 485.无重叠区间

数组区间问题是算法中常见的一类问题,它们通常涉及对数组中的区间进行排序、合并、插入或删除操作。无论是合并区间、插入区间还是删除重复空间,首先都需要区分需要处理的区间的条件,主要是对区间左右边界的比较。以下是数组区间问题的知识点和解决思路的总结:

知识点:

  1. 区间表示:一个区间通常用两个数表示,第一个数是区间的起始点,第二个数是区间的结束点。
  2. 区间排序:如果区间的起始点不同,可以通过排序快速找到重叠的区间,在例题中使用了Arrays.sort(),自定义比较器:
//按照数组区间的第一个元素排序
Arrays.sort(intervals,(a,b) -> a[0] - b[0]);
//按照数组区间的第二个元素排序
Arrays.sort(intervals,(a,b) -> a[1]- b[1]);
  1. 合并区间:当两个区间的起始点不同,但一个区间的结束点大于或等于另一个区间的起始点时,这两个区间可以合并为一个区间。
  2. 插入区间:当需要将一个新的区间插入到已有的区间集合中时,需要考虑新区间与已有区间的关系,可能需要合并区间或调整区间顺序。
  3. 无重叠区间:当区间之间没有公共部分时,这些区间是无重叠的。

解决思路:

  1. 排序:对于区间问题,通常首先需要对区间进行排序,以便于后续操作。排序可以按照起始点进行,也可以按照结束点进行。
  2. 合并区间:(56)
    • 遍历排序后的区间,检查当前区间是否可以与前一个区间合并。
    • 如果可以合并,更新合并后的区间的起始点和结束点。
    • 继续遍历,直到处理完所有区间。
  3. 插入区间:(57)
    • 遍历排序后的区间,找到插入位置。
    • 如果新区间与当前区间重叠,需要合并区间。
    • 更新插入后的区间顺序。
    • 继续遍历,直到处理完所有区间。
  4. 无重叠区间:(253、485)
    • 遍历排序后的区间,检查当前区间是否与前一个区间重叠。
    • 不重叠的条件是后一个区间的左边界大于等于前一个区间的右边界
      在解决区间问题时,通常需要考虑区间的特殊性质,比如区间的大小、起始点和结束点等。此外,还需要注意边界条件,比如空区间、只有一个区间的情况等。通过以上知识点和解决思路,可以解决大多数基本的区间问题。

例题

56.合并区间

思路
本题使用扫描线法来解决,首先要对二维数组进行排序,根据其中数组元素的第一个数字进行升序排列(这里代码里用了一种正则表达式的排序方法,会在知识点总结进行介绍),在排序完成之后进行扫描,有三种情况,我们将最前面的数组区间设置为[start,end],向后扫描:

  1. 后面的区间的starti大于end,那么直接将前一个区间加入结果集中

  2. 后面的区间的starti小于end,这里又会分出两种情况:

    (1)后面的区间完全包含在前面的区间
    (2)后面的区间的endi大于前面区间的end
    以上两种情况我们都需要将end更新为最大的end值,所以可以归结为一类

如果还是不太理解的话可以点击视频讲解-合并区间。
时间复杂度
首先将区间按照起始时间排序,这需要O(nlogn)的时间复杂度,然后遍历排序后的区间,维护一个当前区间的起始时间和结束时间。如果遇到与当前区间重叠的新区间,就更新当前区间的结束时间。如果遇到与当前区间不重叠的新区间,就把当前区间加入到结果列表中,然后更新当前区间的起始时间和结束时间,这个遍历过程需要O(n)的时间复杂度。所以总的时间复杂度是O(nlogn) + O(n) = O(nlogn)
代码实现

class Solution {public int[][] merge(int[][] intervals) {//将ntervals按照数组元素的第一个数排序Arrays.sort(intervals,(a,b) -> a[0] - b[0]);List<int[]> ans = new ArrayList<>();int start = intervals[0][0];int end = intervals[0][1];for(int[] interval : intervals){if(interval[0] > end){ans.add(new int[]{start,end});start = interval[0];end = interval[1];}else{end = Math.max(end,interval[1]);}}ans.add(new int[]{start,end});return ans.toArray(new int[ans.size()][]);}
}

知识总结
1.List的常见使用

//向List中添加元素
List.add(e)
//根据索引获取元素
List.get(index)
//按照索引删除
List.remove(index)
//按照元素内容删除
List.remove(Object o)
//判断List中是否包含某个元素,返回true或false
List.contains(Object o)
//使用element替换该索引处的值
List.set(index,element)
//在该索引位置插入一个值
List.add(index,element)
//返回该值的第一个索引
List.indexOf(Object o)
//返回该值的最后一个索引
List.lastIndexOf(Object o)
//截取List的部分元素,
//注意这里时左闭右开,即fromIndex的值要包括,但是toIndex的值不包括,索引从0开始
List.subList(fromIndex, toIndex)
//返回该List中的元素数
List.size()
//对比两个List的所有元素是否相同
//两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象
List1.equals(List2)
//判断List是否为空
List.isEmpty()
//返回Iterator集合对象
List.iterator()
//将List转换为字符串
List.toString()
//将List转换为数组
List.toArray()

2.二维数组的排序

Arrays.sort(intervals,(a,b) -> a[0] - b[0]);

intervals是一个二维数组,每个元素都是一个包含两个整数的数组,表示一个时间区间的开始和结束时间。(a, b) -> a[0] - b[0]是一个lambda表达式,用作排序的比较函数。它比较两个数组ab的第一个元素,如果a[0]小于b[0],则返回一个负数,表示a应该排在b前面。经过排序,intervals数组中的时间区间会按照开始时间的升序排列。
为什么不能直接使用Arrays.sort(intervals)呢?
由于 intervals 数组中的元素是 int[] 类型的数组。在这种情况下,直接使用 Arrays.sort(intervals) 是不正确的,因为 Java 默认使用数组元素的比较顺序进行排序,对于 int[] 类型来说,比较的是数组的引用,而不是数组中的元素。
对于一维数组,比如 int[] 类型,Arrays.sort() 方法可以直接使用,它会按照数组元素的自然顺序进行排序。
但是对于二维数组 int[][] 类型,情况就不太一样了。因为二维数组的元素是一维数组,所以 Arrays.sort() 默认是按照一维数组的引用进行排序的,而不是按照一维数组中的元素进行排序。
为了按照二维数组中的特定元素进行排序,需要提供一个自定义的比较器,例如 (a, b) -> a[0] - b[0] ,这样可以告诉 Arrays.sort() 方法按照二维数组中的第一个元素进行排序。

57.插入区间

思路:
根据题目要求可以将数组intervals分为三部分,第一部分为需要合并区间的左边部分,可以直接加入结果数组中,第二部分是需要和插入区间合并的区间,第三部分是合并后右侧剩下的区间,直接加入结果数组,区分每个部分的条件如下:
(1)左侧部分:所有数组元素的右边界应该小于插入元素的左边界(intervals[i][1] < newInterval[0]
(2)合并部分:所有数组元素的左边界应该小于插入元素的右边界(intervals[i][0] <= newInterval[1]
下面是一个简单画图说明;
在这里插入图片描述

时间复杂度:
这段代码的时间复杂度为O(n),其中nintervals数组的长度。
代码实现:

class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {List<int[]> ans  = new ArrayList<>();int n = intervals.length;int i = 0;//加入合并区间左边部分的元素while(i < n && intervals[i][1] < newInterval[0]){ans.add(intervals[i++]);}//合并区间if(i < n){newInterval[0] = Math.min(intervals[i][0],newInterval[0]);while(i < n && intervals[i][0] <= newInterval[1]){newInterval[1] = Math.max(intervals[i++][1],newInterval[1]);}}ans.add(newInterval);//处理剩下的元素,即合并区间右边的元素while(i < n){ans.add(intervals[i++]);}return ans.toArray(new int[ans.size() - 1][]);}
}

253.会议室 Ⅱ

思路:
本题采用优先队列解决,使用一个升序排列的优先队列记录每个会议的结束时间,然后遍历数组,当后一个会议的开始时间大于前一个会议的结束时间时,说明两个会议并不冲突,此时前一个会议从优先队列中弹出,后一个会议加入优先队列;反之,前一个会议不弹出,并将后一个会议加入优先队列,可以看出此时队列的大小即为需要会议室的数量,最后处理完所有的会议后返回优先队列的大小即可。
时间复杂度:
这段代码的时间复杂度为O(nlogn),其中nintervals的长度。这是因为使用了优先队列来存储会议的结束时间,并进行了排序。优先队列的插入和删除操作的时间复杂度为O(logn),而插入和删除操作都被执行了n次,所以总的时间复杂度为O(nlogn)
代码实现:

class Solution {public int[][] merge(int[][] intervals) {if(intervals.length == 0) return 0;//使用优先队列来存储会议的结束时间//创建了一个容量为intervals.length的优先队列,按照整数元素的升序排列PriorityQueue<Integer> ans = new PriorityQueue<>(intervals.length, (a , b) -> a - b);ans.offer(intervals[0][1]);for(int i = 1; i < intervals.length ;i++){//会议不冲突时将其弹出,会议冲突时将冲突会议加入//最终优先队列的大小即为需要会议室的数量if(intervals[i][0] >= ans.peek()){ans.poll();}ans.offer(intervals[i][1]);}return ans.size();}
}

485.无重叠区间

思路:
本题需要得到移除区间的最小数量,得到一个不重叠的区间,这里首先将每个区间按照右边界来排序,因为右边界越小说明后面区间可以选择空间越大,这样移除的区间就是最少的。判断不是重叠区间的条件是区间的左边界大于等于上一个区间的右边界。
时间复杂度:
这段代码的时间复杂度为O(nlogn),其中nintervals数组的长度。代码中的Arrays.sort()函数的时间复杂度为O(nlogn),排序完成后,遍历intervals数组的时间复杂度是O(n),因此总的时间复杂度为O(nlogn)
代码实现:

class Solution {public int eraseOverlapIntervals(int[][] intervals) {if(intervals.length < 2) return 0;//将数组按照右边升序排序Arrays.sort(intervals,(a,b) -> a[1]- b[1]);int cnt = 1;int end = intervals[0][1];//遍历数组,找到所有不重复的元素,条件是区间的左边界大于end//符合条件更新end值,并cnt+1for(int i = 1; i < intervals.length;i++){if(intervals[i][0] >= end){end = intervals[i][1];cnt++;}}//返回总数量减去不重叠区间的数量即为结果return intervals.length - cnt;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/329352.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用ScriptGraphicHelper综合图色助手进行找色

使用ScriptGraphicHelper综合图色助手进行找色&#xff0c;然后使用autojs进行点击具体位置。 打开ScriptGraphicHelper软件&#xff0c;载入截图后如上图&#xff0c;比如要点击微信 按住鼠标左键&#xff0c;拖动&#xff0c;选择上图箭头位置,然后点击裁图 可以点击容差范围…

微服务如何做好监控

大家好&#xff0c;我是苍何。 在脉脉上看到这条帖子&#xff0c;说阿里 P8 因为上面 P9 斗争失败走人&#xff0c;以超龄 35 被裁&#xff0c;Boss 上找工作半年&#xff0c;到现在还处于失业中。 看了下沟通记录&#xff0c; 沟通了 1000 多次&#xff0c;但没有一个邀请投递…

基于深度学习的表情识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着人工智能技术的快速发展&#xff0c;表情识别成为了人机交互领域的一个研究热点。表情识别技术旨…

【四、性能测试】Linux stress 压力模拟测试工具

在做 CPU 问题解析之前&#xff0c;需要先了解一下压力模拟工具&#xff0c;可以将 CPU、MEM、IO 等进行压力模拟&#xff0c;可以在模拟压力的过程中进行问题解析 一、STRESS 模拟对CPU、Memory、IO、磁盘进行压力测试。可以使用 stress 工具&#xff0c;它是专门针对 linux…

如何将Docker容器打包并在其他服务器上运行

如何将Docker容器打包并在其他服务器上运行 我会幻想很多次我们的相遇&#xff0c;你穿着合身的T恤&#xff0c;一个素色的外套&#xff0c;搭配一条蓝色的牛仔裤&#xff0c;干净的像那天空中的云朵&#xff0c;而我&#xff0c;还是一个的傻傻的少年&#xff0c;我们相识而笑…

【无标题】(网络原理(中)TCP机制)

网络原理&#xff08;中&#xff09;TCP机制 拥塞控制延迟应答&#xff08;效率机制&#xff09;TCP协议段格式&#xff1a;滑动窗口&#xff08;效率机制&#xff09;流量控制 拥塞控制 TCP拥塞控制这样的过程&#xff0c;就好像 热恋的感觉&#xff0c;指数增长的过程就是热恋…

2024-5-23 石群电路-14

2024-5-23&#xff0c;星期四&#xff0c;22:20&#xff0c;天气&#xff1a;晴&#xff0c;心情&#xff1a;晴。今天没有什么重要的事情发生&#xff0c;心情一如既往的平静&#xff0c;距离返校假期还有两天~~~。 今天观看了石群老师电路基础课程的第23/24个视频&#xff0…

适用于Windows 电脑的最佳视频恢复软件和方法

毫无疑问&#xff0c;丢失您的基本数据总是有压力的&#xff0c;尤其是当这些是您为捕捉最美好回忆而收集的重要视频文件时。要恢复丢失或损坏的视频文件&#xff0c;您可以借助视频恢复工具。但是&#xff0c;在选择最佳视频恢复工具时&#xff0c;您必须考虑多个扫描选项&…

AWS容器之Amazon ECS

Amazon Elastic Container Service&#xff08;Amazon ECS&#xff09;是亚马逊提供的一种完全托管的容器编排服务&#xff0c;用于在云中运行、扩展和管理Docker容器化的应用程序。可以理解为Docker在云中对应的服务就是ECS。

【运维心得】双WAN配置的一个误区

目录 双WAN配置及优势 实际案例 解决之道 最后总结 双WAN配置及优势 什么是双WAN配置&#xff0c;这里就不多赘述&#xff0c;简单的说&#xff0c;首先你要有一台支持双WAN口的路由器&#xff0c;目前大多数企业级路由器都具备了这个功能。甚至有些家用路由器也有此类功能…

Vue02-黑马程序员学习笔记

一、今日学习目标 1.指令补充 指令修饰符v-bind对样式增强的操作v-model应用于其他表单元素 2.computed计算属性 基础语法计算属性vs方法计算属性的完整写法成绩案例 3.watch侦听器 基础写法完整写法 4.综合案例 &#xff08;演示&#xff09; 渲染 / 删除 / 修改数量 …

「YashanDB迁移体验官」Mysql生产环境迁移至YashanDB数据库深度体验

「YashanDB迁移体验官」Mysql生产环境迁移至YashanDB数据库深度体验 1. 前言1.1 产品介绍1.2 产品架构1.3 产品规格1.3.1 数据库版本支持1.3.2 数据类型支持 2. YMP安装2.1 环境说明2.2 执行安装2.3 访问YMP2.3.1 YMP登录界面2.3.2 YMP迁移流程 3. YMP数据迁移3.1 创建数据源3.…

5.23小结

1.java项目创新 目前想添加一个自动回复的功能和设置验证方式有&#xff08;允许任何人添加&#xff0c;禁止添加&#xff0c;设置回答问题添加&#xff0c;普通验证添加&#xff09; 目前只完成画好前端界面&#xff0c;前端发送请求&#xff0c;还有表的修改 因为涉及表字…

Shell编程之条件判断语句

目录 一、条件判断 1、test命令 2、文件测试 3、整数值比较 4、字符串判断 5、逻辑测试 二、if语句 1、if单分支语句 2、双分支语句 3、多分之语句 4、case 分支语句 一、条件判断 Shell环境根据命令执行后的返回状态值&#xff08;echo $?&#xff09;来判断是否执行成…

简析网络风险量化的价值与应用实践,如何构建网络风险预防架构

网络风险量化能够让公司董事会和高管层看清当前的网络安全风险格局&#xff1b;它还将使安全团队能够在业务需求的背景下做出网络安全决策&#xff0c;帮助组织确定哪些风险对业务构成最大的威胁&#xff0c;以及预期的经济损失将是什么。 随着网络攻击手段的日益多样化和复杂…

学硕都考11408的211院校!河北工业大学计算机考研考情分析!

河北工业大学&#xff08;Hebei University of Technology&#xff09;&#xff0c;简称河北工大&#xff0c;坐落于天津市&#xff0c;由河北省人民政府、天津市人民政府与中华人民共和国教育部共建&#xff0c; 隶属于河北省&#xff0c;是国家“双一流”建设高校、国家“211…

jenkins自动化部署详解

一、准备相关软件 整个自动化部署的过程就是从git仓库拉取最新代码&#xff0c;然后使用maven进行构建代码&#xff0c;构建包构建好了之后&#xff0c;通过ssh发送到发布服务的linux服务器的目录&#xff0c;最后在此服务器上执行相关的linux命令进行发布。 此篇文章jenkins…

Default Folder X for Mac v6.0.7激活版:高效、智能的文件管理新选择

在快节奏的工作与生活中&#xff0c;高效管理文件已成为每个Mac用户的迫切需求。Default Folder X for Mac正是为了满足这一需求而生&#xff0c;它以其卓越的性能和丰富的功能&#xff0c;为Mac用户带来了前所未有的文件管理体验。 Default Folder X for Mac拥有直观易用的界面…

数据链路层简单介绍

mac地址&#xff08;物理地址&#xff09; mac地址和ip地址&#xff0c;目的都是为了区分网络上的不同设备的&#xff0c;在最开始的时候&#xff0c;mac地址和ip地址是两伙人&#xff0c;独立各自提出的&#xff0c;ip地址是4个字节&#xff08;早都不够用了&#xff09;&…

BOM..

区别&#xff1a;