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

[Java恶补day14] 56. 合并区间

以数组 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 <= intervals.length <= 10 4 10^4 104
intervals[i].length == 2
0 <= starti <= endi <= 10 4 10^4 104


知识点:
数组、排序


解:
因为需要合并若干个区间,因此对左端点进行升序排序,使用到lambda表达式

对于每个区间,左端点表示这个区间的起始下标,右端点表示这个区间的结束下标

定义一个列表,存储结果,列表的每个元素都是一个int类型的一维数组。

对于intervals的每个元素(即:每一行),按照以下步骤进行:
①获取当前结果列表res的大小
②若当前结果列表res没有元素,表示我们直接原始数组的第一行加入这个结果列表res
③若当前结果列表res有元素,且最后一个元素的右端点≥当前遍历的元素的左端点,如:[1, 3]与[2, 5],表明需要合并区间。因为这个区间已经在结果列表res中,我们做的就是替换这个区间在res的相应左端点:获取更大的结束下标。对于这个例子而言,最大的结束下标是5,也就是p[1],因此让结果列表res中的最后一个元素的右端点更新为这个5。若[1, 4]与[2, 3],则最大的结束下标是4,也就是res.get(len-1)[1],因此结果列表res中的最后一个元素的右端点更新为这个4。
④若当前结果列表res有元素,但最后一个元素的右端点<当前遍历的元素的左端点,则表明无法与当前正在处理的结果列表中的最后一个区间进行合并,那就往res新增一个元素。

最后,我们将List列表,通过.toArray()转为数组,返回。

时间复杂度: O ( n l o g n ) O(nlog n) O(nlogn)Arrays.sort()平均耗时 O ( n l o g n ) O(nlog n) O(nlogn)
空间复杂度: O ( 1 ) O(1) O(1)。排序的栈开销和返回值不计入

class Solution {public int[][] merge(int[][] intervals) {List<int[]> res = new ArrayList<>(); //最后一个元素表示正在合并的区间//原始数据按第一列进行排序Arrays.sort(intervals, (o1, o2) -> (o1[0] - o2[0]));//遍历每一行for (int[] p : intervals) {//获取当前结果列表的大小int len = res.size();//若结果列表有元素,且可合并if (len > 0 && res.get(len - 1)[1] >= p[0]) {//更新右端点最大值res.get(len - 1)[1] = Math.max(res.get(len - 1)[1], p[1]);}//无法合并else {//添加新的合并区间res.add(p);}}//列表转数组并返回return res.toArray(new int[res.size()][]);}
}

参考:
1、灵神解析
2、java二维数组排序

http://www.xdnf.cn/news/10865.html

相关文章:

  • JAVA获取ES连接并查询所有数据
  • RTP over TCP 模式
  • 如何用 pnpm patch 给 element-plus 打补丁修复线上 bug(以 2.4.4 修复 PR#15197 为例)
  • 4-C#的不同窗口传值
  • 洛谷P12610 ——[CCC 2025 Junior] Donut Shop
  • 转战海外 Web3 远程工作指南
  • (10)Fiddler抓包-Fiddler如何设置捕获Firefox浏览器的Https会话
  • 双周报Vol.73:移除使用方法实现 trait 、新增了 “错误多态” 功能、.语法支持使用 _ 的匿名函数...
  • 16QAM在瑞利信道下的性能仿真:从理论到实践的完整解析(附完整代码)
  • 【HarmonyOS 5】鸿蒙Taro跨端框架
  • 【TMS570LC4357】之相关驱动开发学习记录1
  • 总结:线程安全问题的原因和解决方案
  • 初识vue3(vue简介,环境配置,setup语法糖)
  • LlamaIndex的IngestionPipeline添加本地存储(本地文档存储)
  • Unity 环境搭建
  • 【springcloud】快速搭建一套分布式服务springcloudalibaba(四)
  • Python中join()方法完全指南:参数要求与常见用法解析
  • 【深度学习新浪潮】以Dify为例的大模型平台的对比分析
  • 38、响应处理-【源码分析】-HTTPMessageConverter原理
  • C++.双指针算法(1.1目录修正)
  • CA-Net复现
  • 多租户系统的实现方式
  • 第四十天打卡
  • 统计字符数
  • 「Java教案」算术运算符与表达式
  • #16 学习日志软件测试
  • 论文写作核心要点
  • 《高等数学》(同济大学·第7版)第一章第四节《无穷小与无穷大》的超级详细
  • 如何提升大模型召回率和实战案例
  • 页岩油试油试采