1. 思路
这个题目其实只需要先将所有区间按照区间左边界从小到大排序。然后遍历的过程中,判断当前区间和前面是否有重叠,如果有就更新右边界的值,如果没有重叠,就作为一个独立的区间存储起来。我们可以直接在原数组里面进行更新,保证了空间复杂度为O(1)。因为有排序所以时间复杂度为O(nlogn)
2. 代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
int n = intervals.size();
if(n <= 1) return intervals;
sort(intervals.begin(), intervals.end(), [](auto& left, auto& right){ return left[0] < right[0];});
int left = intervals[0][0], right = intervals[0][1], k = 0;
for(int i = 1; i < n; ++i)
{
if(intervals[i][0] <= right)
{
right = max(intervals[i][1], right);
}
else
{
intervals[k][0] = left; intervals[k++][1] = right;
left = intervals[i][0]; right = intervals[i][1];
}
}
intervals[k][0] = left; intervals[k++][1] = right;
intervals.resize(k);
return intervals;
}
};