LeetCode56.合并区间

题目

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

示例

c 复制代码
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

思路

合并重叠区间的一种常见思路是通过排序和遍历来实现:

  • 首先,将给定的区间集合按照区间的起始位置进行排序。这样做的目的是为了方便后续的合并操作。

  • 初始化一个空的结果集,用于存储合并后的区间。

  • 遍历排序后的区间集合。对于每个区间,分为两种情况进行处理:

    • 如果当前结果集为空,或者当前区间与结果集中最后一个区间无重叠(即当前区间的起始位置大于结果集中最后一个区间的结束位置),则将当前区间直接加入结果集。

    • 否则,说明当前区间与结果集中最后一个区间存在重叠。此时,更新结果集中最后一个区间的结束位置,使其变为当前区间的结束位置和原始结束位置中的较大值。

  • 遍历结束后,得到的结果集即为合并后的不重叠区间数组。

这种方法的时间复杂度主要取决于排序的时间复杂度,通常为 O(nlogn),其中 n 是区间的个数。遍历区间的时间复杂度为 O(n)。因此,整体的时间复杂度为 O(nlogn)。

Code:

c 复制代码
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        // 首先按照区间起始位置进行排序
        sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) {
            return a[0] < b[0];
        });
        
        vector<vector<int>> result;
        for (const vector<int>& interval : intervals) {
            // 如果当前结果集为空,或者当前区间与结果集中最后一个区间无重叠,则将当前区间加入结果集
            if (result.empty() || interval[0] > result.back()[1]) {
                result.push_back(interval);
            } else {
                // 否则,更新结果集中最后一个区间的结束位置
                result.back()[1] = max(result.back()[1], interval[1]);
            }
        }
        
        return result;
    }
};
相关推荐
FakeOccupational1 分钟前
【数学 密码学】量子通信:光的偏振&极化的量子不确定性特性 + 量子密钥分发 BB84算法步骤
算法·密码学
ZhengEnCi2 小时前
S10-蓝桥杯 17822 乐乐的积木塔
算法
贾斯汀玛尔斯2 小时前
每天学一个算法--拓扑排序(Topological Sort)
算法·深度优先
t***5442 小时前
如何配置Orwell Dev-C++使用Clang
开发语言·c++
大龄程序员狗哥2 小时前
第25篇:Q-Learning算法解析——强化学习中的经典“价值”学习(原理解析)
人工智能·学习·算法
exp_add32 小时前
质数相关知识
算法
CoderCodingNo2 小时前
【信奥业余科普】C++ 的奇妙之旅 | 13:为什么 0.1+0.2≠0.3?——解密“爆int”溢出与浮点数精度的底层原理
开发语言·c++
小辉同志3 小时前
215. 数组中的第K个最大元素
数据结构·算法·leetcode··快速选择
小O的算法实验室4 小时前
2025年IEEE TITS,基于矩阵的进化计算+面向无线传感器网络数据收集无人机路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
OidEncoder4 小时前
编码器分辨率与机械精度的关系
人工智能·算法·机器人·自动化