【合并区间】

问题

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。
请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

思路

合并重叠区间的问题可以通过排序和遍历的方法来解决。以下是解决这个问题的步骤:1、排序:首先,根据区间的起始点对区间进行排序。
2、初始化:创建一个新的列表 merged 来存储合并后的区间,初始化时可以添加排序后的第一个区间。
3、遍历:遍历排序后的区间列表,对于每个区间,检查它是否与 merged 列表中的最后一个区间重叠。如果重叠,将两个区间合并;如果不重叠,将当前区间添加到 merged 列表中。
4、合并逻辑:如果当前区间的起始点小于或等于 merged 列表中最后一个区间的结束点,则合并这两个区间,即将 merged 列表中最后一个区间的结束点更新为当前区间的结束点和 merged 列表中最后一个区间的结束点的较大值。
当然可以。让我们通过一个具体的例子和图形来解释合并重叠区间的算法。假设我们有以下区间集合:```
intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
```### 步骤 1: 排序
首先,我们根据区间的起始点对区间进行排序。排序后的区间如下:```
sorted_intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
```### 步骤 2: 初始化
我们初始化一个空列表 `merged` 来存储合并后的区间,并添加排序后的第一个区间:```
merged = [[1, 3]]
```### 步骤 3: 遍历并合并
接下来,我们遍历排序后的区间列表,从第二个区间开始,尝试与 `merged` 列表中的最后一个区间合并。#### 合并第一个区间
第二个区间 `[2, 6]` 与 `merged` 中的最后一个区间 `[1, 3]` 重叠(因为 `2 <= 3`)。我们合并这两个区间,合并后的区间为 `[1, 6]`,并更新 `merged` 列表:```
merged = [[1, 6]]
```#### 合并第二个区间
第三个区间 `[8, 10]` 与 `merged` 中的最后一个区间 `[1, 6]` 不重叠(因为 `8 > 6`)。我们直接将这个区间添加到 `merged` 列表中:```
merged = [[1, 6], [8, 10]]
```#### 合并第三个区间
第四个区间 `[15, 18]` 与 `merged` 中的最后一个区间 `[8, 10]` 不重叠(因为 `15 > 10`)。我们直接将这个区间添加到 `merged` 列表中:```
merged = [[1, 6], [8, 10], [15, 18]]
```### 最终结果
经过上述步骤,我们得到了合并所有重叠区间后的不重叠区间数组:```
[[1, 6], [8, 10], [15, 18]]
```### 图形解释
下面是每个步骤的图形表示:1. **初始状态**:```[1, 3]   [2, 6]   [8, 10]   [15, 18]```2. **合并第一个区间**:```[1, 6]       [8, 10]   [15, 18]```3. **合并第二个区间**:```[1, 6]   [8, 10]   [15, 18]```4. **合并第三个区间**:```[1, 6]   [8, 10]   [15, 18]```通过这种方式,我们可以看到每个区间如何被合并,以及最终如何得到一个不重叠的区间数组,该数组覆盖了所有原始区间。

 

解法

class Solution:def merge(self, intervals: list[list[int]]) -> list[list[int]]:if not intervals or len(intervals) <= 1:return intervalsintervals.sort(key =lambda x : x[0])merged = [intervals[0]]for current in intervals[1:]:last = merged[-1]if current[0] <= last[1]:last[1] = max(last[1], current[1])else:merged.append(current)return merged

学习

if not intervals or len(intervals) <= 1: 这行代码是一个条件语句,用于检查 intervals 列表的特定条件。让我们分解这个条件语句来理解它的含义:intervals:这是一个变量,通常是一个列表,包含了一系列的区间,每个区间由一个包含两个元素的列表表示,如 [[start, end]]。not intervals:这部分检查 intervals 是否为 False。在Python中,空列表 [] 被视为 False。所以,如果 intervals 是空列表,not intervals 将为 True。len(intervals) <= 1:这部分检查 intervals 列表的长度是否小于或等于1。如果列表中元素的数量不超过1,即列表为空或只包含一个元素,这个条件为 True。or:这是一个逻辑运算符,用于连接两个条件。如果任一条件为 True,则整个表达式的结果为 True。综合来看,if not intervals or len(intervals) <= 1: 这个条件语句的意思是:如果 intervals 是空列表(即没有区间),或者
如果 intervals 只包含一个区间或没有区间,
那么这个条件语句为真。在这种情况下,通常不需要进一步处理,因为合并区间的逻辑主要适用于至少有两个区间的情况。如果只有一个或没有区间,可以直接返回原始列表,因为没有重叠的区间需要合并。在合并区间的算法中,这个条件通常用于快速返回,避免不必要的计算。例如,如果列表为空或只有一个区间,就直接返回这个列表,因为不需要合并。
`intervals.sort(key=lambda x: x[0])` 这行代码是对列表 `intervals` 进行原地(in-place)排序的语句。这里的 `sort` 方法会对列表中的元素按照指定的关键字进行排序。让我们分解这行代码来更好地理解它:1. `intervals`:这是需要排序的列表,其中每个元素都是一个表示区间的列表 `[start, end]`。2. `sort`:这是Python列表的一个方法,用于对列表中的元素进行排序。默认情况下,`sort` 方法会按照元素的自然顺序进行排序,对于数字来说是从小到大,对于字符串来说是按照字母顺序。3. `key`:这是`sort`方法的一个可选参数,它接受一个函数作为参数。这个函数会在每个元素上调用,`sort`方法会根据这个函数返回的结果来决定元素的排序顺序。4. `lambda x: x[0]`:这是一个匿名函数,也称为lambda函数。它接受一个参数 `x`(在这里,`x` 是 `intervals` 列表中的每个区间),并返回 `x[0]`,即每个区间的起始点。这个lambda函数作为 `key` 参数的值,意味着排序将基于区间的起始点进行。综上所述,`intervals.sort(key=lambda x: x[0])` 这行代码的作用是将 `intervals` 列表中的区间按照它们的起始点进行升序排序。这样,排序后的列表中,每个区间的起始点都会小于或等于它后面区间的起始点,这为后续合并重叠区间的步骤提供了便利。

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

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

相关文章

SpringBoot_第二天

SpringBoot_第二天 学习目标 Mybatis整合&数据访问 使用SpringBoot开发企业项目时&#xff0c;持久层数据访问是前端页面数据展示的基础&#xff0c;SpringBoot支持市面上常见的关系库产品(Oracle,Mysql,SqlServer,DB2等)对应的相关持久层框架&#xff0c;当然除了对于关系…

SparseViT:基于稀疏编码Transformer的非语义中心、参数高效的图像篡改定位

摘要 https://arxiv.org/pdf/2412.14598 非语义特征或语义无关特征&#xff0c;与图像上下文无关但对图像篡改敏感&#xff0c;被认为是图像篡改定位&#xff08;IML&#xff09;的重要证据。由于无法获得人工标签&#xff0c;现有工作依赖于手工方法提取非语义特征。手工非语…

Redisson 分布式锁获取tryLock和lock的区别

问题 boolean isLock lock.tryLock(10, 30, TimeUnit.SECONDS); boolean isLock lock.lock(30, TimeUnit.SECONDS); boolean isLock lock.lock(); 三者的区别&#xff1f;&#xff1f; 这三个方法都是用于获取 Redisson 分布式锁的&#xff0c;但它们在获取锁的方式和行为…

【git】git生成rsa公钥的方法

git生成rsa公钥的方法 一&#xff0c;简介二&#xff0c;操作方法三&#xff0c;总结 一&#xff0c;简介 在工作的过程中&#xff0c;经常需要生成rsa的密钥&#xff0c;然后提供给别人&#xff0c;然后别人给你开通代码下载权限。本文介绍如何在本地生成rsa的密钥供参考。 …

Zookeeper模式安装Kafka(含常规、容器两种安装方式)

一、#创作灵感# 公司使用Kafka的软件项目较多&#xff0c;故写技术笔记巩固知识要点 二、软件环境 - Kafka 3.9.0 官方下载地址&#xff1a;Kafka 3.9.0 - ZooKeeper 3.9.3 官方下载地址&#xff1a;ZooKeeper 3.9.3 - Docker Desktop 4.37 容器图形化工具 官方下载地址…

7.傅里叶级数练习题

7.傅里叶级数练习题 设函数&#xff1a; f ( x ) { − x , 0 ≤ x ≤ 1 2 , 2 − 2 x , 1 2 < x < 1 , f(x) \begin{cases} -x, & 0 \leq x \leq \frac{1}{2}, \\ 2 - 2x, & \frac{1}{2} < x < 1, \end{cases} f(x){−x,2−2x,​0≤x≤21​,21​<x&…

【高项】信息系统项目管理师(二)项目管理概论

一、PMBOK的发展 项目管理知识体系&#xff08;PMBOK&#xff09;是由美国项目管理协会&#xff08;PMI&#xff09;开发的一套描述项目管理专业范围的知识体系&#xff0c;包含了对项目管理所需的知识、技能和工具的描述。 二、项目基本要素 2.1 项目基础 项目是为提供一项…

C++设计模式:状态模式(自动售货机)

什么是状态模式&#xff1f; 状态模式是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态发生改变时&#xff0c;动态改变其行为。通过将状态相关的逻辑封装到独立的类中&#xff0c;状态模式能够将状态管理与行为解耦&#xff0c;从而让系统更加灵活和可维护。 通…

【Pytorch实用教程】循环神经网络中使用dropout需要注意的问题

文章目录 问题解答警告的具体含义解决方案示例代码总结问题 UserWarning: dropout option adds dropout after all but last recurrent layer, so non-zero dropout expects num_layers greater than 1, but got dropout=0.3 and num_layers=1 warnings.warn("dropout op…

数据中台与数据治理服务方案[50页PPT]

本文概述了数据中台与数据治理服务方案的核心要点。数据中台作为政务服务数据化的核心&#xff0c;通过整合各部门业务系统数据&#xff0c;进行建模与加工&#xff0c;以新数据驱动政府管理效率提升与政务服务能力增强。数据治理则聚焦于解决整体架构问题&#xff0c;确保数据…

postgresq-自定义执行计划(custom plan)与generic plan(通用执行计划)

文章目录 之前写过一篇关于 PostgreSQL prepare sql的文章&#xff0c;但当时没有提到generic plan(通用计划)和custom plan(自定义计划)这两个概念。现在将通过举例介绍这两个概念。 创建测试表&#xff1a; postgres# create database demo; CREATE DATABASE postgres# \c d…

dockfile 配置 /etc/apt/source.list.d/debian.list 清华镜像

docker:3.12.7 镜像使用的是 debian 系统&#xff0c;比 ubuntu 更轻量。debian 系统内&#xff0c;apt 镜像源列表位于 /etc/apt/source.list.d/debian.list&#xff08;作为对比&#xff0c;ubuntu 的镜像列表位于 /etc/apt/source.list&#xff0c;二者语法相同&#xff09;…

程序员测试日常小工具

作为一名程序员&#xff0c;或者测试人员&#xff0c;日常工作最常用的工具有哪些&#xff0c;截图&#xff0c;截图漂浮&#xff0c;翻译&#xff0c;日期处理&#xff0c;api调用...&#xff0c; 当你拿到一串报文后&#xff0c;想要json转换时&#xff0c;是不是要打…

【MySQL高级】第1-4章

第1章 存储过程 1.1 什么是存储过程&#xff1f; 存储过程可称为过程化SQL语言&#xff0c;是在普通SQL语句的基础上增加了编程语言的特点&#xff0c;把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中&#xff0c;通过逻辑判断、循环等操作实现复杂计算的程序语言。 换…

深入浅出:AWT事件监听器及其应用

前言 在Java的GUI编程中&#xff0c;事件处理是非常重要的一环。AWT&#xff08;Abstract Window Toolkit&#xff09;框架提供了灵活的事件处理机制&#xff0c;使得开发者能够响应用户的操作&#xff0c;例如点击按钮、键盘输入、鼠标点击等。AWT的事件监听器就是实现这一机…

【Rust自学】8.5. HashMap Pt.1:HashMap的定义、创建、合并与访问

8.5.0. 本章内容 第八章主要讲的是Rust中常见的集合。Rust中提供了很多集合类型的数据结构&#xff0c;这些集合可以包含很多值。但是第八章所讲的集合与数组和元组有所不同。 第八章中的集合是存储在堆内存上而非栈内存上的&#xff0c;这也意味着这些集合的数据大小无需在编…

混合合并两个pdf文件

混合两个pdf 1、在线免费交替和混合奇数和偶数PDF页面2、有什么软件把两个 PDF 交叉合并&#xff1f;3、pdfsam本地合并 如何Google翻译的原文和译文合并&#xff0c;&#xff08;沉浸式翻译效果相对较好&#xff09; 1、在线免费交替和混合奇数和偶数PDF页面 https://deftpd…

Hutool 发送 HTTP 请求的几种常见写法

最简单的 GET 请求&#xff1a; String result HttpUtil.get("https://www.baidu.com");带参数的 GET 请求&#xff1a; // 方法1: 直接拼接URL参数 String result HttpUtil.get("https://www.baidu.com?name张三&age18");// 方法2: 使用 HashMap…

获取用户详细信息-ThreadLocal优化

Thread全局接口可用&#xff0c;不用再重复编写。所以为了代码的复用&#xff0c;使用Thread。把之前的内容&#xff08;函数的参数和map与username&#xff09;注释掉&#xff0c;换为Thread传过来的内容&#xff08;map与username&#xff09;。 因为Thread需要在拦截器里面…

THUCNews解压/THUCNews数据集解压出问题

省流&#xff1a;使用zip64进行解压&#xff0c;文件数目太多windows默认zip16装不下 我在使用THUCNews中文文本数据集时出现了问题&#xff0c;原数据集解压后应该包含以下两个文件夹: 其中THUCNews文件夹下有以新闻类别命名的子文件。官网下载的是一个1.56GB的zip压缩包 而我…