插入区间[中等]

优质博文:IT-BLOG-CN

一、题目

给你一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]

示例 2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间[4,8][3,5],[6,7],[8,10]重叠。

示例 3:
输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]

示例 4:
输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]

示例 5:
输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]

0 <= intervals.length <= 104
intervals[i].length == 2
0 <= intervals[i][0] <= intervals[i][1] <= 105
intervals根据intervals[i][0]按升序排列
newInterval.length == 2
0 <= newInterval[0] <= newInterval[1] <= 105

二、代码

对于区间S1=[l1,r1]S2=[l2,r2]],如果它们之间没有重叠(没有交集),说明要么S1S2的左侧,此时有r1<l2​;要么S1S2的右侧,此时有l1>r2​。

如果r1<l2l1>r2二者均不满足,说明S1S2必定有交集,它们的交集即为[max⁡(l1,l2),min⁡(r1,r2)]并集即为[min⁡(l1,l2),max⁡(r1,r2)]

模拟: 在给定的区间集合X互不重叠的前提下,当我们需要插入一个新的区间S=[left,right]时,我们只需要:
【1】找出所有与区间S重叠的区间集合X′
【2】将X′中的所有区间连带上区间S合并成一个大区间;
【3】最终的答案即为不与X′重叠的区间以及合并后的大区间;

这样做的正确性在于,给定的区间集合中任意两个区间都是没有交集的,因此所有需要合并的区间,就是所有与区间S重叠的区间。并且,在给定的区间集合已经按照左端点排序的前提下,所有与区间S重叠的区间在数组intervals中下标范围是连续的,因此我们可以对所有的区间进行一次遍历,就可以找到这个连续的下标范围。

当我们遍历到区间[li,ri]时:
【1】如果ri<left,说明[li,ri]S不重叠并且在其左侧,我们可以直接将[li,ri]加入答案;
【2】如果li>right,说明[li,ri]S不重叠并且在其右侧,我们可以直接将[li,ri]加入答案;
【3】如果上面两种情况均不满足,说明[li,ri]S重叠,我们无需将[li,ri]加入答案。此时,我们需要将S[li,ri]合并,即将S更新为其与[li,ri]的并集。

那么我们应当在什么时候将区间S加入答案呢?由于我们需要保证答案也是按照左端点排序的,因此当我们遇到第一个 满足li>right的区间时,说明以后遍历到的区间不会与S重叠,并且它们左端点一定会大于S的左端点。此时我们就可以将S加入答案。特别地,如果不存在这样的区间,我们需要在遍历结束后,将S加入答案。

class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {int left = newInterval[0];int right = newInterval[1];boolean placed = false;List<int[]> ansList = new ArrayList<int[]>();for (int[] interval : intervals) {if (interval[0] > right) {// 在插入区间的右侧且无交集if (!placed) {ansList.add(new int[]{left, right});placed = true;                    }ansList.add(interval);} else if (interval[1] < left) {// 在插入区间的左侧且无交集ansList.add(interval);} else {// 与插入区间有交集,计算它们的并集left = Math.min(left, interval[0]);right = Math.max(right, interval[1]);}}if (!placed) {ansList.add(new int[]{left, right});}int[][] ans = new int[ansList.size()][2];for (int i = 0; i < ansList.size(); ++i) {ans[i] = ansList.get(i);}return ans;}
}

时间复杂度: O(n),其中n是数组intervals的长度,即给定的区间个数。
空间复杂度: O(1)。除了存储返回答案的空间以外,我们只需要额外的常数空间即可。

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

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

相关文章

沈阳师范大学期末考试复习pta循环数组函数指针经典编程题汇总+代码分析

前言&#xff1a;临近期末&#xff0c;接下来给大家分享一些经典的编程题&#xff0c;方便大家复习。不一定难&#xff0c;但都是入门的好题&#xff0c;尽可能的吃透彻。因为据说期末考试的题很多来自pta上面的原题。 对于一些语言我是用c来写的&#xff0c;不妨碍理解&#…

Linux下文件操作函数

一.常见IO函数 fopen fclose fread fwrite fseek fflush fopen 运行过程 &#xff1a;打开文件 写入数据 数据写到缓冲区 关闭文件后 将数据刷新入磁盘 1.fopen 返回文件类型的结构体的指针 包括三部分 1).文件描述符&#xff08;整形值 索引到磁盘文件&#xff09;…

AI4S Cup学习赛-中枢神经系统药物研发:药物筛选与优化

赛题介绍 链接&#xff1a;Bohrium 案例广场 (dp.tech) 中枢神经系统类疾病长期以来存在着重要的临床未满足需求。据统计&#xff0c;在当前人口老龄化趋势下&#xff0c;阿兹海默&#xff08;AD&#xff09;、帕金森病&#xff08;PD&#xff09;等神经退行性疾病和脑癌、中…

智能视野:图像识别的全球技术革命

图像识别技术正在全球范围内引领着一场技术革命&#xff0c;为各个领域带来深刻的变革。这一全球性的技术演进不仅在商业和科学领域展现出巨大潜力&#xff0c;还为人们的日常生活提供了更智能、更便捷的体验。 1. 商业智能的崛起&#xff1a; 图像识别技术在商业领域发挥着关…

echarts图表显示不全

图表显示是显示了&#xff0c;但是没有展示全部&#xff0c;一看控制台div的高度只有1px了&#xff0c;手动修改高度也只是拉伸图表&#xff0c;并没有按规定的尺寸展示 随之开始思考为什么呢 ? ? ? 因为 Echarts 的依赖是惰性的&#xff0c;需要手动设置resize&#xff0…

LeetCode37. Sudoku Solver

文章目录 一、题目二、题解 一、题目 Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy all of the following rules: Each of the digits 1-9 must occur exactly once in each row. Each of the digits 1-9 must oc…

《软件工程原理与实践》复习总结与习题——软件工程

软件生命周期 软件生命周期分为三个时期、八个阶段 软件定义时期&#xff1a; 1&#xff09;问题定义阶段&#xff1a;要解决什么问题 2&#xff09;可行性研究阶段&#xff1a;确定软件开发可行 3&#xff09;需求分析阶段&#xff1a;系统做什么 软件开发时期&#xff1a;…

单片机霍尔测速系统设计+源程序

一、系统方案 1、本设计采用52单片机作为主控器。 2、霍尔测速送到液晶1602。 3、蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void lcd_init()//液晶初始化函数* { write_1602com(0x38);//设置液晶工作模式&#xff0c;意思…

嵌入式八股 | 校招秋招 | 笔试面试 | 精选题目

欢迎关注微信公众号【赛博二哈】获取八股PDF 并加入嵌入式求职交流群。提供简历模板、学习路线、岗位整理等 欢迎加入知识星球【嵌入式求职星球】获取完整嵌入式八股。 提供简历修改、项目推荐、求职规划答疑。另有各城市、公司岗位、笔面难题、offer选择、薪资爆料等 嵌入式…

CSS预处理器(如Sass或Less):变量、嵌套规则和混合器等高级功能

在Vue项目中&#xff0c;可以使用CSS预处理器&#xff08;如Sass或Less&#xff09;来编写样式。 这些预处理器提供了一些高级功能&#xff0c;如变量、嵌套规则和混合器等。 1. 变量 在Sass中&#xff0c;我们可以使用$符号定义变量。这些变量方便我们在多个地方重复使用&a…

算法基础之模拟散列表

模拟散列表 核心思想&#xff1a;数组模拟冲突处理 拉链法 #include<iostream>#include <cstring>using namespace std;//找到的大于范围的最小质数const int N100003;//h[x]表示哈希后的数组 e,ne表示处理冲突的链表int h[N],e[N],ne[N],idx;void insert(int x)…

利用数据库的表,生成word文档的表结构注释说明

文章目录 1.场景说明2.解决办法3.生成文档3.1.实现思路3.2.引入Apache POI依赖3.3.获取表及表字段说明Mapper3.4.POI创建文档表格&#xff0c;并填充数据3.5.完整的接口下载代码3.6.效果展示 1.场景说明 在项目中表已经建立好了&#xff0c;但是现在想对外提供一个表的字段的描…

物联网开发(一)新版Onenet 基础配置

onenet新创建的账号&#xff0c;没有了多协议接入&#xff0c;只有新的物联网开放平台 第一讲&#xff0c;先给大家讲一下&#xff1a;新版Onenet 基础配置 创建产品 产品开发-->创建产品 产品的品类选择个&#xff1a;大致符合你项目的即可&#xff0c;没有影响 选择智…

watch函数与watchEffect函数

watach函数&#xff1a; 与vue2.x的配置功能一致 监视指定的一个或多个响应式数据, 一旦数据变化, 就自动执行监视回调 默认初始时不执行回调, 但可以通过配置immediate为true, 来指定初始时立即执行第一次 通过配置deep为true, 来指定深度监视 watchEffect函数&#xff1a;…

企业人力资源公司抖音直播招聘断播怎么处理?

企业人力资源公司抖音直播招聘断播怎么处理&#xff1f; 最直接的处理方式就是进行抖音直播招聘报白&#xff0c;报白后在直播和视频中发布招聘和企业信息&#xff0c;不用担心被封禁和限制流量。 可以通过抖音直播进行招聘&#xff0c;也可以在视频中添加小程序&#xff0c;…

【送书活动二期】Java和MySQL数据库中关于小数的保存问题

之前总结过一篇文章mysql数据库&#xff1a;decimal类型与decimal长度用法详解&#xff0c;主要是个人学习期间遇到的mysql中关于decimal字段的详解&#xff0c;最近在群里遇到一个小伙伴提出的问题&#xff0c;也有部分涉及&#xff0c;今天就再大致总结一下Java和MySQL数据库…

ChatGPT成了背锅侠:利用AI做蹭热点视频

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 在抖音\视频号上已经有很多人利用ChatGPT做热点视频的案例了&#xff0c;视频都是点赞大几千、几万。看完本文&#xff0c;你会略知一二&#xff0c;如下图所示&#xff1a; 这个视频&#xff0c…

Windows安装Docker、自定义安装目录

目录 前言一、Docker安装包下载二、自定义Docker安装路径、设置到其他盘三、安装Docker四、安装后配置1.修改镜像保存路径2.自定义镜像源&#xff08;可选&#xff09; 五、Docker运行验证1.docker/welcome-to-docker2.MySQL服务 总结 前言 Docker是一种开源的容器化平台&…

预付费远传水表好用还是后付费远传水表好用?

在远传水表市场中&#xff0c;预付费远传水表和后付费远传水表各自具有一定的优势和劣势。接下来&#xff0c;小编就来为大家讲下两者的优劣势&#xff0c;以此来判断到底是预付费远传水表好用还是后付费远传水表好用。 一、预付费远传水表 1.优点 (1)先付费后用水&#xff1a;…

Proteus的网络标号与总线

Proteus为了减少过多、复杂的连线&#xff0c;可以使用网络标号与总线配合使用。 Proteus的导线上添加了网络标号&#xff0c;意味着在Proteus上相同的网络标号是连在一起的&#xff0c;所说在图纸上看不出来。 如下图是比较好的Proteus中使用总线的绘制的图纸。可以效仿着画…