当前位置: 首页 > news >正文

插入区间[中等]

优质博文: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)。除了存储返回答案的空间以外,我们只需要额外的常数空间即可。

相关文章:

  • interface previously declared 的bug问题
  • 代码随想录二刷|第七章:回溯算法
  • 第一章 Python基础
  • 【gpts】学算法题[缺失的第一个正数](https://leetcode.cn/problems/first-missing-positive/)
  • Findreport中框架图使用的注意事项
  • 【迅搜04】索引配置(一)加载配置文件以及服务端配置
  • 第四章 python基础之面向对象
  • YoloV7改进策略:RefConv打造轻量化YoloV7利器
  • 实力登榜!迅镭激光荣膺“江苏省瞪羚企业”称号!
  • 初识操作系统
  • 九、hdfs中Namenode元数据处理
  • SDN核心技术与内容
  • 34970A 数据采集 / 数据记录仪开关单元
  • 黑马点评笔记 redis缓存三大问题解决
  • 【深度学习】神经网络训练过程中不收敛或者训练失败的原因
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Git 使用集
  • gitlab-ci配置详解(一)
  • Java 23种设计模式 之单例模式 7种实现方式
  • Ruby 2.x 源代码分析:扩展 概述
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vue 2.3、2.4 知识点小结
  • Vue组件定义
  • 基于游标的分页接口实现
  • 蓝海存储开关机注意事项总结
  • 目录与文件属性:编写ls
  • 前端设计模式
  • 强力优化Rancher k8s中国区的使用体验
  • 世界上最简单的无等待算法(getAndIncrement)
  • 提醒我喝水chrome插件开发指南
  • 为什么要用IPython/Jupyter?
  • 延迟脚本的方式
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #include
  • (04)odoo视图操作
  • (1)(1.13) SiK无线电高级配置(六)
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .net2005怎么读string形的xml,不是xml文件。
  • :如何用SQL脚本保存存储过程返回的结果集
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @test注解_Spring 自定义注解你了解过吗?
  • @Transaction注解失效的几种场景(附有示例代码)
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [Angular] 笔记 18:Angular Router
  • [bzoj2957]楼房重建
  • [C#]C#学习笔记-CIL和动态程序集
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷
  • [HackMyVM]靶场Crossbow
  • [iphone-cocos2d]关于Loading的若干处理和讨论