LeetCode56.合并区间

题目

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervalsi = 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;
    }
};
相关推荐
Nil2081 小时前
LeetCode 283移动零
数据结构·算法·leetcode
CQU_JIAKE1 小时前
10.18【A】
算法
LMT流氓兔1 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain
布莱克6051 小时前
理解 = delete 与 = default:两种赋值语义的差异
c++
文丑颜不良啊2 小时前
LeetCode226~250题目解析
java·leetcode
物联网软硬件开发-轨物科技2 小时前
【轨物方案】深度解读开关柜智能感知及一键顺控专家系统
大数据·运维·网络·人工智能·算法·机器人
小小、码农2 小时前
[特殊字符]【C++11】类的新功能全面解析:移动构造、移动赋值、default、delete、final 与 override
linux·开发语言·网络·c++
行者全栈架构师2 小时前
我用 TRAE Work 把桌游之夜搬进了浏览器:一个计分器的从创意到上线
前端·算法·架构
YFJ_mily3 小时前
【10-12月优质学术会议合集】会议覆盖人工智能、大数据、高端装备、软件与网络安全 、计算机视觉技术等热门方向
算法·安全·web安全·网络安全·软件·rdlink研发家
库玛西3 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法