news 2026/4/20 20:55:13

普通数组---合并区间

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
普通数组---合并区间

🔥个人主页:Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

一、题目解读

题目描述

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

示例分析

  • 示例 1:输入[[1,3],[2,6],[8,10],[15,18]],输出[[1,6],[8,10],[15,18]]。解释:区间[1,3][2,6]存在重叠,合并为[1,6],其余区间无重叠直接保留。
  • 示例 2:输入[[1,4],[4,5]],输出[[1,5]]。解释:相邻区间也被视为重叠区间,需要合并。
  • 示例 3:输入[[4,7],[1,4]],输出[[1,7]]。解释:输入区间无序,需先排序再判断重叠。

从示例中我们可以提炼出两个核心关键点:输入区间可能无序重叠 / 相邻区间都需要合并

二、解题思路:贪心算法

解决区间合并问题的核心逻辑是贪心策略,核心思想是:优先合并左端点小的区间,通过维护当前合并区间的右端点,逐步吸收后续重叠区间。具体步骤如下:

  1. 排序:将所有区间按照左端点从小到大排序。排序后,我们只需依次比较当前区间与已合并区间的重叠情况,无需考虑乱序问题。
  2. 遍历合并
    • 初始化一个结果数组,用于存储最终的合并区间。
    • 遍历排序后的区间:
      • 若结果数组为空,直接将当前区间加入结果数组。
      • 若当前区间的左端点结果数组最后一个区间的右端点,说明两个区间重叠 / 相邻,需要合并 —— 更新结果数组最后一个区间的右端点为「两者右端点的最大值」。
      • 若当前区间的左端点>结果数组最后一个区间的右端点,说明无重叠,直接将当前区间加入结果数组。

三、代码实现(C++)

结合上述思路,我们可以写出简洁高效的 C++ 代码,代码中添加了详细注释,便于理解:

cpp

class Solution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { // 第一步:按区间左端点从小到大排序 sort(intervals.begin(), intervals.end()); vector<vector<int>> res; // 结果数组,存储合并后的区间 for (auto& interval : intervals) { // 情况1:结果数组为空,直接加入第一个区间 // 情况2:当前区间左端点 > 结果数组最后一个区间的右端点,无重叠,直接加入 if (res.empty() || interval[0] > res.back()[1]) { res.emplace_back(interval); } else { // 情况3:有重叠,合并区间(更新右端点为最大值) res.back()[1] = max(res.back()[1], interval[1]); } } return res; } };

四、关键细节解析

1. 为什么要按左端点排序?

排序是贪心算法的前提。排序后,区间的左端点呈递增趋势,我们只需关注当前区间与结果数组最后一个区间的右端点的关系,就能线性遍历完成合并,无需回溯,将时间复杂度从暴力解法的 \(O(n^2)\) 降低到 \(O(n \log n)\)(排序的时间复杂度)。

2. 为什么要用max更新右端点?

这是很多初学者容易忽略的点!例如输入[[1,5],[2,3]],排序后第一个区间是[1,5],第二个区间是[2,3]。此时第二个区间完全被第一个区间包含,若直接覆盖右端点会得到错误结果[1,3],而用max就能保留正确的右端点5

3. 关于emplace_back的使用

代码中使用res.emplace_back(interval)而非res.push_back(interval),两者功能相同,但emplace_back是直接在容器尾部构造对象,避免了拷贝操作,效率更高,是 C++11 及以上版本的推荐写法。

五、复杂度分析

  • 时间复杂度:\(O(n \log n)\)。其中 n 是区间的数量,排序操作的时间复杂度为 \(O(n \log n)\),遍历操作的时间复杂度为 \(O(n)\),整体由排序主导。
  • 空间复杂度:\(O(\log n)\)(排序的系统栈空间)或 \(O(n)\)(存储结果的数组,最坏情况无重叠,需存储所有区间)。

六、总结

合并区间问题是贪心算法在区间类问题中的典型应用,其核心套路可以总结为:排序定顺序,遍历判重叠,贪心合并区间

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 21:03:53

如何编写组织一个现代企业官网的 HTML/CSS 代码

目录 前端代码结构 & 注释方法教程&#xff08;以企业官网为例&#xff09; 1. 整体文件结构 2. Head 头部详解 3. Body 主体结构分层 4. CSS 结构组织 5. 命名规范与语义化 6. 响应式设计注释 7. HTML 中数据表格的注释 8. 示例&#xff1a;完整的注释版代码片段…

作者头像 李华
网站建设 2026/4/18 21:12:00

API调用还是本地部署?LLM使用策略对比

API调用还是本地部署?LLM使用策略对比 关键词:API调用、本地部署、大语言模型(LLM)、使用策略、成本效益、性能 摘要:本文旨在深入探讨大语言模型(LLM)使用中API调用和本地部署这两种策略的特点、优势与劣势。通过详细分析核心概念、算法原理、数学模型,结合实际项目案…

作者头像 李华
网站建设 2026/4/18 21:03:57

Java SpringBoot+Vue3+MyBatis 在线家具商城设计与实现pf系统源码|前后端分离+MySQL数据库

摘要 随着互联网技术的快速发展和电子商务的普及&#xff0c;在线购物已成为人们日常生活中不可或缺的一部分。家具行业作为传统零售的重要组成部分&#xff0c;也逐渐向线上转型&#xff0c;以满足消费者对便捷、多样化购物体验的需求。在线家具商城系统通过数字化手段打破了传…

作者头像 李华