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

力扣第五十七题——插入区间

内容介绍

给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。

在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。

返回插入之后的 intervals

注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。

示例 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] 重叠。

提示:

  • 0 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 105
  • intervals 根据 starti 按 升序 排列
  • newInterval.length == 2
  • 0 <= start <= end <= 105

完整代码

 int** insert(int** intervals, int intervalsSize, int* intervalsColSize, int* newInterval, int newIntervalSize, int* returnSize, int** returnColumnSizes) {*returnSize = 0;int left = newInterval[0];int right = newInterval[1];bool placed = false;int** ans = malloc(sizeof(int*) * (intervalsSize + 1));*returnColumnSizes = malloc(sizeof(int*) * (intervalsSize + 1));for (int i = 0; i < intervalsSize; ++i) {int* interval = intervals[i];if (interval[0] > right) {// 在插入区间的右侧且无交集if (!placed) {int* tmp = malloc(sizeof(int) * 2);tmp[0] = left, tmp[1] = right;(*returnColumnSizes)[*returnSize] = 2;ans[(*returnSize)++] = tmp;placed = true;}int* tmp = malloc(sizeof(int) * 2);memcpy(tmp, interval, sizeof(int) * 2);(*returnColumnSizes)[*returnSize] = 2;ans[(*returnSize)++] = tmp;} else if (interval[1] < left) {// 在插入区间的左侧且无交集int* tmp = malloc(sizeof(int) * 2);memcpy(tmp, interval, sizeof(int) * 2);(*returnColumnSizes)[*returnSize] = 2;ans[(*returnSize)++] = tmp;} else {// 与插入区间有交集,计算它们的并集left = fmin(left, interval[0]);right = fmax(right, interval[1]);}}if (!placed) {int* tmp = malloc(sizeof(int) * 2);tmp[0] = left, tmp[1] = right;(*returnColumnSizes)[*returnSize] = 2;ans[(*returnSize)++] = tmp;}return ans;
}

思路详解

一、问题背景

给定一个二维数组intervals,其中每个子数组表示一个区间,我们需要合并这些区间,使得没有重叠的区间尽可能紧密相连。同时,我们有一个新的区间newInterval,需要将其插入到intervals中。

二、解题思路

  1. 排序

    • 首先,我们需要对intervals数组进行排序。排序的依据是每个子数组的第一个元素,因为合并的目的是让没有重叠的区间尽可能紧密相连。
  2. 插入新区间

    • 创建一个List<int[]>,用于存储合并后的区间。
    • 遍历排序后的intervals数组,对于每个区间,根据合并策略添加或更新列表中的区间。
    • 同时,插入新区间newInterval,根据新区间与当前区间的相对位置,决定是否需要更新列表中的区间。
  3. 返回结果

    • 遍历完成后,将List<int[]>转换为二维数组并返回。

三、代码详解

  1. 排序
    • 使用Arrays.sort方法对intervals数组进行排序,比较器比较的是每个子数组的第一个元素。
Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] interval1, int[] interval2) {return interval1[0] - interval2[0];}
});
  1. 插入新区间
    • 遍历排序后的intervals数组,对于每个区间,根据合并策略添加或更新列表中的区间。
    • 同时,插入新区间newInterval,根据新区间与当前区间的相对位置,决定是否需要更新列表中的区间。
for (int i = 0; i < intervalsSize; ++i) {int* interval = intervals[i];if (interval[0] > right) {// 在插入区间的右侧且无交集if (!placed) {int* tmp = malloc(sizeof(int) * 2);tmp[0] = left, tmp[1] = right;(*returnColumnSizes)[*returnSize] = 2;ans[(*returnSize)++] = tmp;placed = true;}int* tmp = malloc(sizeof(int) * 2);memcpy(tmp, interval, sizeof(int) * 2);(*returnColumnSizes)[*returnSize] = 2;ans[(*returnSize)++] = tmp;} else if (interval[1] < left) {// 在插入区间的左侧且无交集int* tmp = malloc(sizeof(int) * 2);memcpy(tmp, interval, sizeof(int) * 2);(*returnColumnSizes)[*returnSize] = 2;ans[(*returnSize)++] = tmp;} else {// 与插入区间有交集,计算它们的并集left = fmin(left, interval[0]);right = fmax(right, interval[1]);}
}
  1. 返回结果
    • 遍历完成后,将List<int[]>转换为二维数组并返回。
return ans;

四、总结

通过上述步骤,我们能够有效地合并区间,并将新区间插入到区间列表中。关键在于正确地排序区间并合并它们。这种方法的时间复杂度为O(n log n),其中n是intervals数组的长度,因为排序操作的时间复杂度为O(n log n)。空间复杂度为O(n),用于存储合并后的区间。

知识点精炼

一、核心概念

  1. 排序算法:在解决组合问题时,排序可以帮助我们找到最优解或近似解。
  2. 动态规划:在某些情况下,我们可以通过动态规划来优化算法,减少重复计算。
  3. 二维数组:在处理与位置相关的数据时,二维数组是一个非常有用的数据结构。

二、知识点精炼

  1. 区间合并问题

    • 给定一个二维数组intervals,其中每个子数组表示一个区间,需要合并这些区间,使得没有重叠的区间尽可能紧密相连。
  2. 插入新区间

    • 创建一个List<int[]>,用于存储合并后的区间。
    • 遍历排序后的intervals数组,对于每个区间,根据合并策略添加或更新列表中的区间。
    • 同时,插入新区间newInterval,根据新区间与当前区间的相对位置,决定是否需要更新列表中的区间。
  3. 返回结果

    • 遍历完成后,将List<int[]>转换为二维数组并返回。

三、性能分析

  • 时间复杂度:O(n log n),其中n是intervals数组的长度,因为排序操作的时间复杂度为O(n log n)。
  • 空间复杂度:O(n),用于存储合并后的区间。

四、实际应用

  • 数据处理:在处理与位置相关的数据时,这种算法可以帮助我们合并区间,使得没有重叠的区间尽可能紧密相连。
  • 算法竞赛:在算法竞赛中,掌握这种算法对于解决与区间合并相关的问题非常有帮助。

五、代码实现要点

  • 排序:正确使用Arrays.sort方法进行排序。
  • 合并区间:正确实现合并策略,避免数组越界和重复添加。
  • 返回结果:正确返回合并后的区间数组。

 

相关文章:

力扣第五十七题——插入区间

内容介绍 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区…...

跟《经济学人》学英文:2024年08月03日这期 India’s economic policy will not make it rich

India’s economic policy will not make it rich A new World Bank report takes aim at emerging-market growth plans 原文&#xff1a; The developing world has fallen back in love with economic planning. As protectionism sweeps the West, poor countries are n…...

js 深拷贝、浅拷贝深度解析

赋值操作&#xff1a; let obj{a:1,b:[1,2,3],c:{m:2}}let newObjobjnewObj.a2newObj.b.push(4)newObj.c.m3console.log(obj,newObj); 将一个对象赋值给一个变量&#xff0c;其实就是将这个对象在栈内存中的引用地址复制给了这个变量&#xff0c;这两个对象指向堆内存中的同一个…...

CSS文本两端对齐

背景 如果我们要写了列表或表单类的样式&#xff0c;名称长短不一&#xff0c;但是想要两端对齐&#xff0c;如下面这样的&#xff1a; 你是怎么写的&#xff1f; 是这样的吗&#xff0c;在HTML里调整加空格&#xff1a; <ul><li>用户名</li><li>账 …...

C#中的foreach和自定义比较

在C#中foreach不能修改集合里面的值 在C#中&#xff0c;使用 foreach 循环遍历集合时&#xff0c;通常不建议修改集合中的元素&#xff0c;因为 foreach 循环是针对集合的枚举器进行操作的&#xff0c;而枚举器通常不支持修改集合中的元素。如果尝试在 foreach 循环中修改集合…...

有序转化数组(LeetCode)

题目 给你一个已经 排好序 的整数数组 和整数 、 、 。对于数组中的每一个元素 &#xff0c;计算函数值 &#xff0c;请 按升序返回数组 。 解题 在时间复杂度为解决问题 def sortTransformedArray(nums, a, b, c):def f(x):return a * x * x b * x cn len(nums)result…...

大数据信用报告查询有什么作用?怎么选择查询平台?

随着互联网的快速发展&#xff0c;人们的金融行为越来越多地依赖于网络平台。然而&#xff0c;网络上的金融交易存在着一定的风险&#xff0c;为了有效地防范这些风险&#xff0c;金融机构采用了大数据技术进行风险控制&#xff0c;下面&#xff0c;小易大数据平台将详细介绍大…...

import cv2ModuleNotFoundError: No module named ‘cv2‘

import cv2 ModuleNotFoundError: No module named cv2 (base) PS D:\CAMERA-D861T\LabelImg> pip3 install cv2 ERROR: Could not find a version that satisfies the requirement cv2 (from versions: none) ERROR: No matching distribution found for cv2 办法1 试了无…...

[Modbus] Modbus协议开发-基本概念(一)

历史 ModBus官网是Modicon&#xff08;Modicon早年已被施耐德收购&#xff09;公司为其PLC通讯而开发的一种通讯协议。 概述 通过Modbus协议&#xff0c;控制器之间、或控制器经由网络&#xff08;如以太网&#xff09;可以和其它设备之间进行通信。 优点 免费、好用、成熟…...

爬虫代理的使用:提升爬虫效率

爬虫代理的基本概念 爬虫代理&#xff0c;简单来说&#xff0c;就是位于客户端和目标服务器之间的一个中转站。当爬虫发起请求时&#xff0c;不是直接发送给目标服务器&#xff0c;而是先发送给代理服务器&#xff0c;再由代理服务器转发给目标服务器。目标服务器响应后&#…...

【gcc】基于gpt和python的流程和延迟梯度分析

Core Flow and Algorithm Concepts of GCC (Google Congestion Control) 【TWCC 】基于gpt和python简化分析webrtc拥塞控制论文: Analysis and Design of the Google Congestion Contro for Web Real-time Communication (WebRTC)参考大神的理解发送码率(send bitrate)影响了网…...

前端CSS总结

目录 前言 正文 CSS基础介绍&#xff1a; CSS选择器&#xff1a; 元素选择器&#xff1a; id和class选择器&#xff1a; 后代选择器和群组选择器&#xff1a; 盒子模型 content&#xff1a; padding&#xff1a; border&#xff1a; margin&#xff1a; 字体样式 …...

Linux/C 高级——指针函数

1.概念 本质是函数&#xff0c;函数的返回值为指针。类比着指针数组。 指针数组&#xff1a;本质是数组&#xff0c;数组中存放指针。 数据类型 *数组名[元素个数]; int a[2][3]; int *arr[2] {a[0],a[1]}; //*(*(arri)j) *(arr[i]j) arr[i][j] 2.定义格式 格式&#xff1a; 数…...

GRU门控循环单元【数学+图解】

文章目录 1、简介2、门控机制3、公式4、图解GRU4.1、重置门和更新门4.2、候选隐藏状态和隐藏状态⭐ 5、LSTM与GRU的对比6、应用7、训练技巧 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff…...

代码随想录算法训练营第六十一天|Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路

卡码网&#xff1a;94. 城市间货物运输 I from collections import dequeclass Edge:def __init__(self, to, val):self.to to # 链接的节点self.val val # 边的权重def main():n, m map(int, input().split())grid [list() for _ in range(n 1)] # 初始化邻接表for _…...

ArrayList集合源码解读(二)已完结

ArrayList集合源码解读&#xff08;二&#xff09; 前言 这篇文章已经把 ArrayList 更完了。各位还想看什么源码可以私信我~~ 上节课带大家阅读了 ArrayList 中的核心扩容代码&#xff0c;那么今天带大家阅读下List集合中我们常用的几个方法的底层实现逻辑&#xff01; 常用…...

光伏逆变器、MPPT、PCS储能变流器、BMU、BCU、BDU和液冷机组

一、光伏逆变器 光伏逆变器&#xff08;PV inverter或solar inverter&#xff09;可以将光伏&#xff08;PV&#xff09;太阳能板产生的可变直流电压转换为市电频率交流电&#xff08;AC&#xff09;的逆变器&#xff0c;可以反馈回商用输电系统&#xff0c;或是供离网的电网使…...

OpenHarmony编译

简介&#xff1a;本文将会介绍编译OpendHarmony环境的搭建、编译、和刷机&#xff08;rk3568&#xff09; 使用场景&#xff1a;修改系统源码&#xff0c;需要验证修改的功能是否正确、编译镜像、编译SDK 1、VS Code&#xff0c;下载链接&#xff0c;用于修改源码 2、linux环…...

C语言典型例题30

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.7 从银行贷了一笔款d&#xff0c;准备每月还款额为p&#xff0c;月利率为r&#xff0c;计算多少个月能还清。 设d30000元&#xff0c;p6000元&#xff0c;r1%。对求得的月份取小数点后一位&#xff0c;对第二…...

springMVC @RestControllerAdvice注解使用方式

使用 RestControllerAdvice 的主要场景包括&#xff1a; 全局异常处理&#xff1a;处理所有控制器中抛出的未捕获异常。数据校验失败处理&#xff1a;处理 Bean Validation 校验失败的情况。自定义响应&#xff1a;统一定义响应格式或错误信息。 RestControllerAdvice 注解的…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...