力扣经典150题第四十九题:插入区间

目录

      • 题目描述和要求
      • 示例解释
      • 解题思路
      • 算法实现
      • 复杂度分析
      • 测试和验证
      • 总结和拓展
      • 参考资料

题目描述和要求

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

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

返回插入之后的 intervals。

示例解释

示例 1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
解释:插入新区间 [2,5] 后,原区间 [1,3] 和 [6,9] 合并为 [1,5]。

示例 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,10]。

解题思路

我们可以对区间进行遍历,根据新区间与当前区间的关系进行合并。具体步骤如下:

  1. 初始化一个结果列表,用于存储合并后的区间。
  2. 遍历区间列表,如果当前区间的结束位置小于新区间的起始位置,则将当前区间加入结果列表。
  3. 如果当前区间的起始位置大于新区间的结束位置,则将新区间加入结果列表,并更新新区间为当前区间。
  4. 如果当前区间与新区间存在重叠,则更新新区间的起始位置为当前区间和新区间起始位置的较小值,更新新区间的结束位置为当前区间和新区间结束位置的较大值。
  5. 将最后的新区间加入结果列表。
  6. 返回结果列表。

算法实现

import java.util.ArrayList;
import java.util.List;public class InsertInterval {public int[][] insert(int[][] intervals, int[] newInterval) {List<int[]> merged = new ArrayList<>();int index = 0;int n = intervals.length;// 添加所有在新区间之前的区间while (index < n && intervals[index][1] < newInterval[0]) {merged.add(intervals[index++]);}// 合并重叠的区间while (index < n && intervals[index][0] <= newInterval[1]) {newInterval[0] = Math.min(newInterval[0], intervals[index][0]);newInterval[1] = Math.max(newInterval[1], intervals[index][1]);index++;}merged.add(newInterval);// 添加剩余的区间while (index < n) {merged.add(intervals[index++]);}return merged.toArray(new int[merged.size()][]);}
}

复杂度分析

  • 时间复杂度:O(n),其中 n 为区间的数量。遍历一次区间列表。
  • 空间复杂度:O(n),额外使用了一个列表存储合并后的区间。

测试和验证

编写测试用例对算法进行验证,确保其正确性和健壮性。

import java.util.Arrays;public class Main {public static void main(String[] args) {InsertInterval insertInterval = new InsertInterval();int[][] intervals1 = {{1, 3}, {6, 9}};int[] newInterval1 = {2, 5};System.out.println(Arrays.deepToString(insertInterval.insert(intervals1, newInterval1))); // [[1,5],[6,9]]int[][] intervals2 = {{1, 2}, {3, 5}, {6, 7}, {8, 10}, {12, 16}};int[] newInterval2 = {4, 8};System.out.println(Arrays.deepToString(insertInterval.insert(intervals2, newInterval2))); // [[1,2],[3,10],[12,16]]}
}

总结和拓展

本题通过对区间的遍历和合并操作,实现了对新区间的插入操作。算法思路清晰简单,在处理类似问题时是一个不错的选择。

除了当前算法,我们也可以考虑其他实现方式,例如使用二分查找来寻找新区间的插入位置,或者使用栈来辅助合并区间等方法。

参考资料

  • 《力扣经典150题》
  • LeetCode 官方网站

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

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

相关文章

开源库交叉编译(七)--- FAAD2

官网&#xff1a;https://www.linuxfromscratch.org/blfs/view/svn/multimedia/faad2.html 源码&#xff1a;faad2-2.10.1.tar.gz Step 1&#xff1a;解压 tar -xvzf faad2-2.10.1.tar.gzcd faad2-2.10.1/ Step 2&#xff1a;创建安装目录 mkdir arm_faad2 Step 3&#…

MyBatis:mybatis入门

MyBatis 持久层框架,用于简化JDBC开发,是对原始JDBC程序的封装 持久层 数据访问层(dao),用来操作数据库 框架 一个半成品软件,一套可重用的通用软件代码模型. JDBC (Java DataBase Connectivity) 使用java语言操作关系型数据库的一套API 本质是sun公司官方定义的一套操…

打印机-STM32版本 硬件部分

最终PCB EDA工程: 一、确定芯片型号 根据项目需求&#xff0c;梳理需要用到的功能&#xff0c; 电量检测&#xff1a;ADC 按键&#xff1a;IO input外部中断 LED&#xff1a;IO output 温度检测&#xff1a;ADC 电机控制&#xff1a;IO output 打印通讯&#xff1a;SPI …

C++string类使用大全

目录 温馨提示&#xff1a;这篇文章有约两万字 什么是string类&#xff1f; 一. 定义和初始化string对象 1.string的构造函数的形式&#xff1a; 2.拷贝赋值运算符 3.assign函数 二.string对象上的操作 1.读写string对象 2.读取未知数量的string对象 3.使用getline …

windows ubuntu sed,awk,grep篇:10.awk 变量的操作符

目录 62. 变量 64. 算术操作符 65. 字符串操作符 66. 赋值操作符 67. 比较操作符 68. 正则表达式操作符 62. 变量 Awk 变量以字母开头&#xff0c;后续字符可以是数字、字母、或下划线。关键字不能用作 awk 变量。 不像其他编程语言&#xff0c; awk 变量可以直接使…

实习面试之算法准备:数学题

目录 1 技巧2 例题2.1 Nim 游戏2.2 石子游戏2.3 灯泡开关 1 技巧 稍加思考&#xff0c;找到规律 2 例题 2.1 Nim 游戏 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。 你们轮流进行自己的回合&#xff0c; 你作为先手 。 每一回合&#xf…

vue修饰符有哪些

Vue中常用的修饰符主要有以下几类&#xff1a; 事件修饰符&#xff1a; .stop&#xff1a;阻止事件的冒泡&#xff0c;相当于调用了event.stopPropagation()方法。 .prevent&#xff1a;阻止事件的默认行为&#xff0c;相当于调用了event.preventDefault()方法。 .capture&a…

python让input显示默认值,并且用户还可以修改

感觉是很正常的需求&#xff0c;但python默认没有这个功能。linux下有readline库&#xff0c;具体没试过&#xff0c;但我是WINDOWS下。看到有用kernel32.GetStdHandle(STD_INPUT_HANDLE)获取标准输入&#xff0c;再WriteConsoleInput模拟输入的&#xff0c;但WINDOWS下API调用…

SpringBoot 打包所有依赖

SpringBoot 项目打包的时候可以通过插件 spring-boot-maven-plugin 来 repackage 项目&#xff0c;使得打的包中包含所有依赖&#xff0c;可以直接运行。例如&#xff1a; <plugins><plugin><groupId>org.springframework.boot</groupId><artifact…

CMake:编译日志信息的使用(五)

1、日志调试信息 在CMake中可以用用户显示一条信息&#xff0c;该命令的名字为message&#xff1a; # 格式 # message([STATUS | WARNING | AUTHOR_WARNING | SEND_ERROR | FATAL_ERROR] "Message infomation...")(无)&#xff1a;重要信息STATUS&#xff1a;非重要…

2024五一杯数学建模B题思路代码文章教学-交通需求规划与可达率问题

交通需求规划与可达率问题 问题总结&#xff1a; 问题一&#xff1a;在一个小型交通网络中&#xff0c;给定的起点和终点之间的交通需求需分配到相应路径上。目标是最大化任意一条路段出现突发状况时的交通需求期望可达率。 问题二&#xff1a;在一个较大的交通网络中&#xff…

负债56亿,购买理财产品遭违约,操纵虚假粉丝,流量在下滑,客户数量减少,汽车之家面临大量风险(三)

本文由猛兽财经历时5个多月完成。猛兽财经将通过以下二十二个章节、8万字以上的内容来全面、深度的分析汽车之家这家公司。 由于篇幅限制&#xff0c;全文分为&#xff08;一&#xff09;到&#xff08;十&#xff09;篇发布。 本文为全文的第七章、第八章、第九章。 目录 …

【Linux—进程间通信】共享内存的原理、创建及使用

什么是共享内存 共享内存是一种计算机编程中的技术&#xff0c;它允许多个进程访问同一块内存区域&#xff0c;以此作为进程间通信&#xff08;IPC, Inter-Process Communication&#xff09;的一种方式。这种方式相对于管道、套接字等通信手段&#xff0c;具有更高的效率&…

一文入门交叉编译

前言: 在阅读本文之前&#xff0c;你哦需要了解makefile文件的编写规则&#xff0c;这里我们推荐两篇入门: Makefile 规则-CSDN博客 Makefile 快速入门-CSDN博客 编译定义 编译是指将源代码文件&#xff08;如C/C文件&#xff09;经过预处理、编译、汇编和链接等步骤&#x…

SpringBoot社区医院信息平台 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本项目旨在设计并实现一个基于Spring Boot的社区医院信息平台&#xff0c;为社区医院提供信息化管理和服务&#xff0c;包括挂号预约、医生排班、医…

如何从0深入PostgreSQL内核写一个执行器算子?

如何从0深入PostgreSQL内核写一个执行器算子&#xff1f; 大家好&#xff0c;我叫光城&#xff0c;昨天分享了一个主题&#xff1a;如何从0深入PostgreSQL内核写一个执行器算子&#xff1f;今天来总结一下&#xff0c;本篇文章的直播回放可以在b站观看&#xff0c;点击原文或者…

[PS小技能学习]抠图和切图

详情见视频教程&#xff1a;PS小技巧--抠图与切图 今天我们来学习如何使用PS对表情包合辑进行抠图和裁剪保存 1、首先&#xff0c;将图片导入&#xff0c;双击图层新建一个图层 2、然后点击工具栏的魔棒工具&#xff0c;再点击顶部菜单栏的添加到选区 3、点击图片的空白区域即…

IMU状态预积分功能实现与测试

IMU状态预积分功能实现与测试 前言实现IMU状态预积分类测试程序验证预积分与直接积分的效果结果 前言 预积分&#xff1a;是一种十分常见的IMU数据处理方法。 与传统的IMU运动学积分不同&#xff0c;预积分可以将一段时间内的IMU测量数据累积&#xff0c;建立预积分测量&#…

两院院士泌尿外科专家吴阶平教授

吴阶平&#xff08;1917-2011&#xff09;&#xff0c;男&#xff0c;江苏常州人&#xff0c;1933年天津汇文中学毕业&#xff0c;保送到北平燕京大学医预科&#xff0c;1937年毕业于北平燕京大学获理学士学位&#xff0c;1942年毕业于北平协和医学院获医学博士学位&#xff0c…

银行卡归属地查询API接口快速对接

银行卡归属地查询API接口指的是通过银行卡号查询该银行卡详细信息&#xff0c;包括银行卡名称、卡种、卡品牌、发卡行、编号以及归属地等信息&#xff0c;支持一千多家银行返回归属地信息&#xff0c;那么银行卡归属地查询API接口如何快速对接呢&#xff1f; 首先找到有做银行…