给出一个区间的集合,请合并所有重叠的区间。
示例 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]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
题目链接:中文题目;英文题目
首先,这题需要明确一下输入的限制,否则会有很多歧义,题意也没有明说:
1 <= intervals[i].length <= 2,且intervals[i][0] <= intervals[i][1]
其实用sort排序之后,思路非常好理解的。我们以下面这个例子为例:
[[1,3],[2,6],[8,10],[15,18]]
升序排序之后,我们确保相邻两个间距最近,如果它们不能合并,则第一个间距则不可能和后面的间距合并。比如上面这个例子,[1,3]右边界3大于[2,6]左边界2,它们可以合并,之后[2,6]的右边界6小于[8,10]左边界8,所以不能合并,因为是升序排序,所以[2,6]也不能和比[8,10]远的[15,18]合并。所以我们利用这点,总结出下面的合并规律:
前一个间隔右边界小于等于后一个间隔左边界,则可以合并;反之,则不能合并,将这个间隔加入答案中,移动到下一个间隔,继续合并后面的间隔;
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> ans;
if (!intervals.size()) return ans;
sort(intervals.begin(), intervals.end());
int start = intervals[0][0], end = intervals[0][1];
for (vector<int>& interval : intervals) {
if (end >= interval[0]) end = max(end, interval[1]);
else { ans.push_back({ start, end }); start = interval[0]; end = interval[1]; }
}
ans.push_back({ start, end });
return ans;
}
};