Leetcode 合并区间

news2024/11/16 7:26:04

在这里插入图片描述

我们借助一个辅助链表(元素类型是一维数组)来进行结果统计。

这个算法解决了“合并区间”的问题,具体要求是给定一组区间(每个区间有开始和结束位置),如果两个区间有重叠,那么需要将它们合并成一个区间,并返回所有不重叠的区间。

算法思想:

  1. 排序区间
    首先,我们将所有区间按照其开始时间进行排序。这是解决问题的关键,因为一旦区间按照开始时间排序后,我们可以轻松地通过遍历来检查相邻区间是否重叠。

    • 假设我们有区间:[[1,3], [2,6], [8,10], [15,18]]。排序后区间变为:[[1,3], [2,6], [8,10], [15,18]],这里已经按照开始时间排序好了。

    通过排序后,可以保证如果两个区间能够合并,那么它们必然是相邻的,这样我们可以通过一趟遍历完成合并操作。

  2. 合并区间
    在遍历区间时,我们将检查每个区间和之前的区间是否有重叠:

    • 如果当前区间的开始时间大于上一个区间的结束时间,说明它们不重叠,此时将当前区间添加到结果中。
    • 如果当前区间的开始时间小于或等于上一个区间的结束时间,说明它们有重叠,此时将它们合并成一个区间。合并的规则是更新上一个区间的结束时间为两个区间结束时间的最大值。

    举个例子:

    • 第一个区间 [1,3] 和第二个区间 [2,6] 有重叠,因为 2 小于等于 3,因此我们将它们合并为 [1,6]
    • 然后再看区间 [8,10][1,6],它们没有重叠(因为 8 大于 6),所以直接将 [8,10] 添加到结果中。
    • 同理,区间 [15,18] 也不与之前的区间重叠,直接加入结果。
  3. 返回结果
    遍历所有区间后,我们得到了合并后的区间集合,并将其返回。

算法流程:

  1. 首先对所有区间按起始位置升序排序。
  2. 使用一个链表 merged 存储合并后的区间。
  3. 遍历排序后的区间列表:
    • 如果当前区间与已合并的最后一个区间没有重叠,直接将当前区间加入 merged
    • 如果当前区间与最后一个区间重叠,更新最后一个区间的结束时间为两个区间中结束时间的较大值。
  4. 遍历完成后,将链表转换为数组并返回。

时间复杂度:

  1. 排序的时间复杂度O(n log n),其中 n 是区间的数量。
  2. 合并过程的时间复杂度O(n),因为我们只需要遍历一次区间列表。

因此,整体时间复杂度是 O(n log n),其中 n 是区间的数量。

示例:

输入:[[1,3],[2,6],[8,10],[15,18]]

  1. 首先按起始位置排序,得到:[[1,3],[2,6],[8,10],[15,18]]
  2. 合并 [1,3][2,6],结果是 [1,6]
  3. 8,10[1,6] 无重叠,直接添加。
  4. 15,18 和之前无重叠,直接添加。

输出:[[1,6],[8,10],[15,18]]

通过这个思路,我们能够高效地解决合并区间的问题。

Java 代码

class Solution {
    public int[][] merge(int[][] intervals) {
        //首先对intervals中的子数组按照开始时间(左区间)进行排序
        //Arrays.sort默认使用双轴快速排序, 根据第二个参数提供的lamba表达式定义的比较规则进行排序(升序)
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));//a, b是intervals中的两个元素,也就是2个子数组

        //然后初始化一个元素类型为一维数组的链表来存放结果
        LinkedList<int[]> merged = new LinkedList<>();

        for(int[] interval : intervals) {
            //根据merged结果链表中的末尾元素的右区间值和当前循环所指向的子数组的左区间元素进行判断
            if(merged.isEmpty() || merged.getLast()[1] < interval[0]) {
                //如果结果链表中末尾元素的右区间值小于当前子数组左区间元素值,说明没有重叠,直接加入当前子数组
                merged.add(interval);
            } else {
                //否则,有重叠,不需要添加子数组到结果链表中,仅仅需要更新链表末尾元素的右区间元素值
                merged.getLast()[1] = Math.max(merged.getLast()[1], interval[1]);
            }
        }
        //把结果链表转换为数组
        return merged.toArray(new int[merged.size()][]);
    }
}

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

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

相关文章

【Linux】ubuntu 16.04 搭建jdk 11 环境(亲测可用)

目录 0.环境 1.题外话 2.详细 0.环境 windows11 主机 Virtual Box 7.0 ubuntu 16.04系统 想搭建个 jdk11的环境&#xff0c;用于项目 1.题外话 因为虚拟机与主机传输文件不方便&#xff0c;所以可以尝试用共享文件夹的方式传输&#xff0c;亲测可用&#xff0c;参考以下博…

JAVA并发编程系列(10)Condition条件队列-并发协作者

一线大厂面试真题&#xff0c;模拟消费者-生产者场景。 同样今天的分享&#xff0c;我们不纸上谈兵&#xff0c;也不空谈八股文。以实际面经、工作实战经验进行开题&#xff0c;然后再剖析核心源码原理。 按常见面经要求&#xff0c;生产者生产完指定数量产品后&#xff0c;才能…

计算机毕业设计 校运会管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

函数模板进阶 - 为什么函数模板不要特化?

本文参考文章2001 年 7 月的 C/C++ Users Journal,第 19 卷第 7 期:Why Not Specialize Function Templates? 大家有兴趣可以看看原文。 文章目录 一、 重载和特化1. 重载2. 特化二、特化和重载的调用优先级1. 第一份代码2. 第二份代码3. 原因三、函数模板特化的书写格式1. …

防护装备穿戴与否检测系统源码分享

防护装备穿戴与否检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

【机器学习】生成对抗网络(GAN)——生成新数据的神经网络

生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;简称GAN&#xff09;是一种创新的神经网络结构&#xff0c;近年来在机器学习和人工智能领域引起了广泛的关注。GAN的核心思想是通过两个神经网络的对抗性训练&#xff0c;生成高质量的、与真实数据相似的新…

webview2加载本地页面

加载方式 通过导航到文件 URL 加载本地内容 使用方式&#xff1a; webView->Navigate( L"file:///C:/Users/username/Documents/GitHub/Demos/demo-to-do/index.html"); 但是这种方式存在一些问题&#xff0c;比如&#xff1a; 存在跨域问题&#xff08;我加载…

邮件发送高级功能详解:HTML格式、附件添加与SSL/TLS加密连接

目录 一、邮件HTML格式设置 1.1 HTML邮件的优势 1.2 HTML邮件的编写 二、添加附件 2.1 附件的重要性 2.2 添加附件的代码示例 2.3 注意事项 三、使用SSL/TLS加密连接 3.1 SSL/TLS加密的重要性 3.2 SSL/TLS加密的工作原理 3.3 在邮件发送中启用SSL/TLS 3.3.1 邮件客…

计算机毕业设计 校园志愿者管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【关联规则Apriori】【算法】【商务智能方法与应用】课程

探索Apriori算法&#xff1a;数据挖掘中的频繁项集与关联规则 在当今数据驱动的世界中&#xff0c;数据挖掘技术正变得越来越重要。今天&#xff0c;我们将通过一个实际案例&#xff0c;了解并应用Apriori算法&#xff0c;这是一种广泛用于发现频繁项集及其关联规则的算法&…

使用k8s部署RainLoop-Webmail

说明 * rainloop最新源码官方下载地址&#xff1a;https://www.rainloop.net/downloads/ * 系统要求&#xff1a;https://www.rainloop.net/docs/system-requirements/ * 安装文档&#xff1a;https://www.rainloop.net/docs/installation/ * 更多详细资料请查看官方文档 * do…

CentOS Linux教程(7)--目录文件的创建、删除、移动、复制、重命名

文章目录 1. 创建目录、文件2. 删除目录、文件3. 移动目录、文件4. 复制目录、文件5. 重命名目录、文件 1. 创建目录、文件 使用mkdir创建目录&#xff1a; 使用touch创建文件&#xff1a; 2. 删除目录、文件 使用rm可以删除文件: 使用rm -f可以强制删除文件&#xff0c;…

状态机设计模式

1. 订单管理中存在的问题 订单管理中&#xff0c;订单存在未支付&#xff0c;派单中&#xff0c;服务中&#xff0c;已完成等等状态&#xff0c;所以在业务代码中&#xff0c;都是首先判断订单的状态&#xff0c;然后根据不同状态执行不同的逻辑。 在业务代码中对订单状态进行…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第九集:制作小骑士基本的攻击行为Attack以及为敌人制作生命系统和受伤系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作小骑士基本的攻击行为Attack 1.制作动画以及使用UNITY编辑器编辑2.使用代码实现扩展新的落地行为和重落地行为3.使用状态机实现击中敌人造成伤害机制二…

移动端列表筛选封装

适合场景&#xff1a;Vue2vant 移动端项目&#xff0c;数据填充添加全部选项及相关逻辑处理&#xff0c;支持多选、单选以及筛选状态返回 效果图 选中交互 使用说明 <filter-box ref"filterBox" :isMultiple"true" //是否多选:params"waitData&q…

ant design vue实现表格序号递增展示~

1、代码实例 //current当前页数 //pageSize每页记录数 const columns [{title: 序号,width: 100,customRender: ({ index }) > ${index (current.value - 1) * pageSize.value 1},align: center,fixed: left,} ] 2、效果图

虚拟机:4、配置12.5的cuda和gromacs

前言&#xff1a;本机环境是win11&#xff0c;通过wsl2安装了ubuntu实例并已实现gpu直通&#xff0c;现在需要下载12.5的cuda 一、查看是否有gpu和合适的cuda版本 在ubuntu实例中输入 nvidia-smi输出如下&#xff1a; 说明该实例上存在gpu驱动&#xff0c;且适合的CUDA版本…

解决银河麒麟操作系统在单用户模式下根分区只读的问题

解决银河麒麟操作系统在单用户模式下根分区只读的问题 1、问题描述2、问题解决方法 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟操作系统时&#xff0c;有时我们可能需要进入单用户模式来进行系统维护或修复。然而&#x…

软考高级:中台相关知识 AI 解读

中台&#xff08;Middle Platform&#xff09;是近年来在软件开发和企业架构中兴起的一种理念和架构模式&#xff0c;尤其在中国的互联网企业中得到了广泛应用。中台的核心思想是通过构建一个共享的服务和能力平台&#xff0c;支持前端业务的快速迭代和创新&#xff0c;从而提升…

企业职工薪资查询系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;员工管理&#xff0c;部门管理&#xff0c;工资信息管理&#xff0c;工资安排管理&#xff0c;考勤信息管理&#xff0c;交流论坛&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#…