排序题目:合并区间

文章目录

  • 题目
    • 标题和出处
    • 难度
    • 题目描述
      • 要求
      • 示例
      • 数据范围
  • 解法
    • 思路和算法
    • 代码
    • 复杂度分析

题目

标题和出处

标题:合并区间

出处:56. 合并区间

难度

5 级

题目描述

要求

给定区间数组 intervals \texttt{intervals} intervals,其中 intervals[i] = [start i , end i ] \texttt{intervals[i] = [start}_\texttt{i}\texttt{, end}_\texttt{i}\texttt{]} intervals[i] = [starti, endi],合并所有重叠的区间,并返回一个不重叠的区间数组,该数组覆盖输入中的所有区间。

示例

示例 1:

输入: intervals = [[1,3],[2,6],[8,10],[15,18]] \texttt{intervals = [[1,3],[2,6],[8,10],[15,18]]} intervals = [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]] \texttt{[[1,6],[8,10],[15,18]]} [[1,6],[8,10],[15,18]]
解释:区间 [1,3] \texttt{[1,3]} [1,3] [2,6] \texttt{[2,6]} [2,6] 重叠, 将它们合并为 [1,6] \texttt{[1,6]} [1,6]

示例 2:

输入: intervals = [[1,4],[4,5]] \texttt{intervals = [[1,4],[4,5]]} intervals = [[1,4],[4,5]]
输出: [[1,5]] \texttt{[[1,5]]} [[1,5]]
解释:区间 [1,4] \texttt{[1,4]} [1,4] [4,5] \texttt{[4,5]} [4,5] 可被视为重叠区间。

数据范围

  • 1 ≤ intervals.length ≤ 10 4 \texttt{1} \le \texttt{intervals.length} \le \texttt{10}^\texttt{4} 1intervals.length104
  • intervals[i].length = 2 \texttt{intervals[i].length} = \texttt{2} intervals[i].length=2
  • 0 ≤ start i ≤ end i ≤ 10 4 \texttt{0} \le \texttt{start}_\texttt{i} \le \texttt{end}_\texttt{i} \le \texttt{10}^\texttt{4} 0startiendi104

解法

思路和算法

为了合并数组 intervals \textit{intervals} intervals 中的所有重叠的区间,需要首先将所有的区间排序,然后判断是否有重叠的区间,并将重叠的区间合并。

对区间排序的方法是,首先将区间按照开始位置升序排序,如果存在多个区间的开始位置相同,则按照结束位置降序排序。排序之后,相同开始位置的多个区间中,第一个区间是最长的区间,对于每个开始位置只需要保留最长的区间。

由于无法事先知道合并后剩余多少个区间,因此使用列表存储合并后的区间。遍历排序后的数组 intervals \textit{intervals} intervals,首先将首个区间(即 intervals [ 0 ] \textit{intervals}[0] intervals[0])添加到列表中,然后对其余的区间依次判断是否需要和已有的区间合并,并更新列表。

由于相同开始位置的多个区间只保留最长的区间,因此对于遍历到的每个区间,需要判断该区间与数组 intervals \textit{intervals} intervals 中的上一个区间的开始位置是否相同,如果相同则跳过。当前区间不跳过时,将当前区间记为 curr \textit{curr} curr,将列表中的最后一个区间记为 prev \textit{prev} prev。由于已经对数组 intervals \textit{intervals} intervals 排序,因此 prev \textit{prev} prev 的开始位置一定小于 curr \textit{curr} curr 的开始位置。比较 curr \textit{curr} curr 的开始位置和 prev \textit{prev} prev 的结束位置,执行如下操作。

  • 如果 curr \textit{curr} curr 的开始位置小于等于 prev \textit{prev} prev 的结束位置,则 prev \textit{prev} prev curr \textit{curr} curr 重叠,需要合并,合并之后的区间的开始位置是 prev [ 0 ] \textit{prev}[0] prev[0](因为 prev [ 0 ] < curr [ 0 ] \textit{prev}[0] < \textit{curr}[0] prev[0]<curr[0]),结束位置是 max ⁡ ( prev [ 1 ] , curr [ 1 ] ) \max(\textit{prev}[1], \textit{curr}[1]) max(prev[1],curr[1])。更新 prev [ 1 ] \textit{prev}[1] prev[1] 的值,即可实现合并,不需要将 curr \textit{curr} curr 添加到列表中。

  • 如果 curr \textit{curr} curr 的开始位置大于 prev \textit{prev} prev 的结束位置,则 prev \textit{prev} prev curr \textit{curr} curr 不重叠,因此将 curr \textit{curr} curr 添加到列表中。

遍历结束之后,将列表转成数组返回。

代码

class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, (a, b) -> {if (a[0] != b[0]) {return a[0] - b[0];} else {return b[1] - a[1];}});List<int[]> mergedList = new ArrayList<int[]>();mergedList.add(intervals[0]);int length = intervals.length;for (int i = 1; i < length; i++) {int[] curr = intervals[i];int[] prev = mergedList.get(mergedList.size() - 1);if (curr[0] == prev[0]) {continue;}if (curr[0] <= prev[1]) {prev[1] = Math.max(prev[1], curr[1]);} else {mergedList.add(curr);}}return mergedList.toArray(new int[mergedList.size()][]);}
}

复杂度分析

  • 时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn),其中 n n n 是数组 intervals \textit{intervals} intervals 的长度。排序需要 O ( n log ⁡ n ) O(n \log n) O(nlogn) 的时间,排序后遍历数组合并区间需要 O ( n ) O(n) O(n) 的时间,时间复杂度是 O ( n log ⁡ n ) O(n \log n) O(nlogn)

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是数组 intervals \textit{intervals} intervals 的长度。存储合并后的区间的列表需要 O ( n ) O(n) O(n) 的空间。

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

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

相关文章

LeetCode 热题100-9 找到字符串中所有字母异位词

找到字符串中所有字母异位词 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s &quo…

linux系统编程:数据库

1. 数组、链表、变量-----》内存&#xff1a;程序运行结束、掉电数据丢失 文件----------------------》硬盘&#xff1a;程序运行结束、掉电数据不丢失 数据库&#xff1a; 专业存储数据、大量数据-----》硬盘 sqlite相关的命令 .tables 查看…

库克库伯防爆电容器会起火吗

库克库伯&#xff08;Cooke Colb&#xff09;防爆电容器设计用于在具有爆炸性气体或粉尘的危险环境中安全运行。尽管这些防爆电容器经过严格的设计和测试&#xff0c;能够保障不会出现爆炸现象&#xff0c;以确保在恶劣环境中运行时的安全性&#xff0c;但在某些极端情况下&…

[数据集][目标检测]电力场景输电线均压环歪斜检测数据集VOC+YOLO格式303张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;303 标注数量(xml文件个数)&#xff1a;303 标注数量(txt文件个数)&#xff1a;303 标注类别…

416.分割等和子集

416.分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和…

【网络安全】Instagram 和 Meta 2FA 绕过漏洞

未经许可,不得转载。 文章目录 漏洞概述技术细节Meta 2FA 绕过步骤Instagram 2FA 绕过步骤总结漏洞概述 该漏洞允许攻击者在具有受害者Facabook账户权限的情况下,绕过 Meta 的双重身份验证 (2FA) 机制,实现账户接管;并且也能够绕过 Instagram 的双重身份验证 (2FA) 机制,…

【GeoScenePro】Generic Server Error

错误 解决方案 在portal中进行知识图谱许可授权

国密起步5:GmSSL3交叉编译arm64

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 之前已经建立好了交叉编译环境…

视频集中存储智能边缘计算网关软硬一体机智能边缘计算网关应用场景

在信息化飞速发展的今天&#xff0c;数据处理的速度和效率直接影响到各行各业的运作和发展。传统的云计算模式虽然强大&#xff0c;但在面对实时性和带宽要求越来越高的应用场景时&#xff0c;往往显得力不从心。此时&#xff0c;智能边缘计算网关的出现&#xff0c;为我们带来…

FreeRTOS线程同步---信号量

目录 二值信号量 二值信号量相关API函数 一般使用方法为 1.创建二值信号量 2.在一个任务中置为二值释放信号 3.在另一个任务中获取信号 信号量是一种解决同步问题的机制&#xff0c;可以实现对共享资源的有序访问。其中&#xff0c;“同步”指的 是任务间的同步&#xff…

Spring Boot报错:没有配置数据源(url属性未设置)

文章目录 小结问题解决参考 小结 Spring Boot报错&#xff1a;没有配置数据源&#xff08;url属性未设置&#xff09;&#xff0c;进行解决。 问题 Spring Boot报错&#xff1a; ERROR 2024-08-28 17:24:43.734 [main] - *************************** APPLICATION FAILED T…

24年7月-8月工作笔记整理(前端)

目录 一、问题解决二、基础知识学习 一、问题解决 1.浏览器拦截跳转的解决方案 //先打开一个空白页let winHandler window.open(, _blank)//再重定向到想要跳转的链接winHandler.location.href redirectUrl2.文字大小跟随父级元素宽度适配缩放 //父元素加不换行和相对定位…

sqli-labs靶场(56-60)

56关 ?id-1)union select 1,2,database()-- 看数据库 ?id-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- 看表 ?id-1) union select 1,group_concat(column_name),3 from information_schema.columns wh…

深入探索MySQL数据库结构设计:实战案例解析,打造高效、可扩展的数据存储方案

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 前言&#xff1a;…

noge-gyp构建项目踩坑记录

开发环境 系统: win11 node: 19.7.0 npm: 8.3.2 node-gyp: 10.0.2可以不使用windows-build-tools来安装构建工具,手动进行安装 我这边用windows-build-tools安装时候会提示 process.env only accepts a configurable, writable, and enumerable data descriptor. 查了资料后…

转换视频格式轻松搞定!3个小窍门助你轻松将mxf格式转mp4

你是否因为格式转换而烦恼&#xff1f;你是否经历过这样的情况&#xff1a;你想要在别的设备或平台上播放心仪的视频&#xff0c;但是你的视频文件是xmf格式的&#xff0c;很多设备都不支持这个格式&#xff0c;导致视频无法播放。现在&#xff0c;你需要把mxf格式转mp4格式。你…

【时间盒子】-【2.准备】HarmonyOS 开发前需要准备什么?

零基础新手或转行进入鸿蒙生态应用的开发者&#xff0c;请提前准备以下内容&#xff1a; 一、注册华为帐号 此帐号在华为官方各平台通用&#xff0c;比如&#xff1a;华为手机、华为商城、华为云、华为开发者联盟等等。 https://id1.cloud.huawei.com/CAS/portal/userRegist…

linux 下转化 ppk 文件 为openssh 文件(private,public)

1. 首先安装&#xff1a; puttygen ubuntu &#xff1a; apt install putty-tools 2. ppk 文件转化 openssh key private key : puttygen /path/to/puttykey.ppk -O private-openssh -o ~/.ssh/id_rsa public key: puttygen /path/to/puttykey.ppk -O public-openssh -o…

如何在Windows和Mac上免费提取RAR文件?这里有方法

序言 你有没有下载过一个文件,却发现它有一个奇怪的.rar文件扩展名?RAR是一种压缩文件格式,与ZIP文件非常相似,在本文中,我们将向你展示如何在Windows或macOS上打开RAR文件。 如何在Windows 11上打开RAR文件 Windows 11在2023年增加了对RAR文件的原生支持。从那时起,你…

问:说说内部类和静态内部类的区别?

示例 内部类&#xff08;Non-static Inner Class&#xff09;: public class OuterClass {private String outerField "我是外部类字段";class InnerClass {public void display() {System.out.println(outerField); // 可以直接访问外部类的成员}}public void sh…