hot100_合并数组

合并区间题解

hot100_合并数组

分析

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

示例

输入:[[1,3],[2,6],[8,10],[15,18]]

输出:[[1,6],[8,10],[15,18]]

解释:区间 [1,3] 和 [2,6] 重叠,将它们合并为 [1,6]。


题解

排序+双指针

思路

  1. 按区间左端点排序,保证区间从左到右排布;

  2. 遍历,维护当前合并后的区间:

    • 如果下一个区间左端点 ≤ 当前区间右端点 → 重叠,合并,更新右端取两者最大值;

    • 否则不重叠,把当前区间存入答案,更新为新区间。

代码

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> ans;
        if (intervals.empty()) return ans;
        sort(intervals.begin(), intervals.end());
        vector<int> cur = intervals[0];
        for(int i = 1; i < intervals.size(); i++) {
            int start = intervals[i][0];
            int end = intervals[i][1];
            if (start <= cur[1]) {
                cur[1] = max(cur[1], end);
            } else {
                ans.push_back(cur);
                cur = intervals[i];
            }
        }
        ans.push_back(cur);
        return ans;
    }
};

时间复杂度:O(nlog⁡n)O(n\log n),主要开销是排序;遍历是 O(n)O(n) 空间复杂度:O(log⁡n)O(\log n) 排序栈开销;返回结果不计入。

56. 合并区间 - 力扣(LeetCode)

chengzi