数组的长度是10^4,所以应该使用O(N)的做法
题意:所有重叠的区间应该合并成一个区间,最后返回所有合并完后的区间
这题不可以使用右端点升序排序,应该使用左端点升序排序
如图所示
我们知道,右端点的升序排序会导致next区间会完全大于当前区间,如果采用右端点升序排序,最后的结果是返回4个区间!不是最优解,这是因为小区间和区间之间有断点,那么,我们应该选用一种排序,让4这个大区间在前面,那么就是选择左端点升序排序了!!
左端点升序排序,可能会出现2一样的比当前区间完全小的区间,那么不应该让r直接r=a[1],应该比较一下,(这里l就不用比较了,一定是递增的)。
详见代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),[](const auto&a,const auto& b)
{
return a[0]<b[0];
});
vector<vector<int>> res;
vector<int> qq;
int ed=-2e9;
int l=0,r=-2e9;
for(int i=0;i<intervals.size();i++)
{
auto a=intervals[i];
if(r<a[0])
{
if(r!=-2e9)
{//这样子防止压入初始的r
qq.push_back(l);
qq.push_back(r);
res.push_back(qq);
}
l=a[0];
r=a[1];
qq.clear();
}
else
r=max(r,a[1]);
}
//此时应该再次插入一次
qq.push_back(l);
qq.push_back(r);
res.push_back(qq);
return res;
}
};