给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。
要求:空间复杂度 O(n)O(n),时间复杂度 O(nlogn)O(nlogn)
进阶:空间复杂度 O(val)O(val),时间复杂度O(val)O(val)
输入:
[[10,30],[20,60],[80,100],[150,180]]
输出
[[10,60],[80,100],[150,180]]
思路:先排序,排序好的区间只有两种可能:
1.两个区间重合
如果区间有交集,判断第二个的右区间是否大于结果集中的右区间,如果大于,说明两个区间是交叉的,如果小于说明包含。
2.两个区间不重合,直接添加到结果集合中去。
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
static bool cmp(Interval& a, Interval& b)
{
return a.start < b.start;
}
vector<Interval> merge(vector<Interval> &intervals) {
if(intervals.size() == 0) return {};
sort(intervals.begin(), intervals.end(), cmp);
//排序后的第一个一定是最小的
vector<Interval> ret;
ret.push_back(intervals[0]);
for(int i = 1;i < intervals.size();i++)
{
// 相等时,也合并
if(intervals[i].start <= ret.back().end)
{
ret.back().end = max(ret.back().end, intervals[i].end);
}else
{
ret.push_back(intervals[i]);
}
}
return ret;
}
};