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

LeetCode[中等] 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

思路

区间排序:

开始位置  ——> 升序排序,若多个开始位置相同,按照结束位置降序排序

——> 相同开始位置的多个区间中,第一个区间为最长区间,仅保留最长区间

使用列表mergedList存储合并后的区间(无法事先知道合并后剩余多少区间)。

遍历排序后的数组intervals,首先将首个区间(即intervals[0])添加到列表中,然后对其余的区间依次判断是否需要和已有区间合并,并更新列表。

对于遍历到的每个区间,判断与intervals中的上一个区间开始位置是否相同,相同则跳过;不相同时,将当前区间记为curr,将列表中最后一个区间记为prev。比较curr的开始位置和prev的结束位置。

  • 如果curr[0] <= prev[1]  =》左端点小于右端点,(此时curr[0] > prev[0],curr[1] > prev[1])则prev和curr重叠,需要合并
    开始位置:prev[0];结束位置:max(prev[1[, curr[1])。
    更新prev[1]的值,不需要将curr添加到列表中;
    prev[0]        curr[0]        prev[1]        curr[1]
  • 如果curr[0] > prev[1],则curr与prev不重叠,将curr添加到列表中。
    prev[0]        prev[1]        curr[0]       curr[1]
public class Solution {public int[][] Merge(int[][] intervals) {Array.Sort(intervals, (a, b) =>{if(a[0] != b[0])return a[0] - b[0];//a[0]与b[0]升序排序elsereturn b[1] - a[1];//b[1]与a[1]降序排序});List<int[]> mergedList = new List<int[]>();mergedList.Add(intervals[0]);for(int i = 1; i < intervals.Length; i++){int[] curr = intervals[i];int[] prev = mergedList[mergedList.Count - 1];if(curr[0] == prev[0])continue;if(curr[0] <= prev[1])prev[1] = Math.Max(prev[1], curr[1]);elsemergedList.Add(curr);}return mergedList.ToArray();}
}

复杂度分析

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++ | Leetcode C++题解之第400题第N位数字
  • unity3d入门教程六
  • [001-03-007].第07节:Redis中的管道
  • 【python报错已解决】`ModuleNotFoundError: No module named ‘requests‘`
  • 中级练习[4]:Hive SQL商品销售与用户增长数据分析
  • python使用Pyvis库绘制B站评论互动网络结构图
  • LeetCode70:爬楼梯
  • 后端入门 (JQuery基础) 01
  • Python 正则表达式详解:从基础匹配到高级应用
  • AIGC实战——多模态模型Flamingo
  • 手势开关灯
  • 上海泗博EtherNet/IP转PROFIBUS DP网关EPS-320IP成都地铁项目应用案例
  • Router安装以及导入
  • SRT3D: A Sparse Region-Based 3D Object Tracking Approach for the Real World
  • 【Unity学习心得】如何制作俯视角射击游戏
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • android图片蒙层
  • CEF与代理
  • docker-consul
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 产品三维模型在线预览
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 计算机在识别图像时“看到”了什么?
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 使用docker-compose进行多节点部署
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 大数据全解:定义、价值及挑战
  • ​Java基础复习笔记 第16章:网络编程
  • # SpringBoot 如何让指定的Bean先加载
  • #13 yum、编译安装与sed命令的使用
  • #NOIP 2014#Day.2 T3 解方程
  • #控制台大学课堂点名问题_课堂随机点名
  • $jQuery 重写Alert样式方法
  • (4.10~4.16)
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (实战篇)如何缓存数据
  • (转)大型网站的系统架构
  • (转)平衡树
  • ./configure,make,make install的作用
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core控制台应用程序初识
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET处理HTTP请求
  • .NET中统一的存储过程调用方法(收藏)
  • /run/containerd/containerd.sock connect: connection refused
  • ?.的用法
  • @RequestBody与@RequestParam
  • @RequestMapping用法详解
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [1181]linux两台服务器之间传输文件和文件夹
  • [Android]竖直滑动选择器WheelView的实现