解题思路
1、按照区间起点从小到大排序
2、每一次比较答案中最后一个区间终点和未遍历的区间点
3、若起点小于等于终点,说明有区间重叠,选取两个区间较大的终点作为新的终点
时间复杂度:O(nlogn)
代码
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
//二维数组按列排序
sort(intervals.begin(),intervals.end(),[](const vector<int> &a,const vector<int> &b){return a[0]<b[0];});
vector<vector<int>> ans;
ans.emplace_back(intervals[0]);
for(int i = 1; i < intervals.size();i++){
int n = ans.size();
//和答案中的最后一个区间去比较,因为前面的区间都不会有重合
if(intervals[i][0] <= ans[n-1][1]) {
//如果第i个区间的开端小于答案中最后一个区间的开端,就可能需要合并
//在第i个区间和答案中最后一个区间选择一个较大的结尾
ans[n-1][1] = max(intervals[i][1],ans[n-1][1]);
}
else {
ans.emplace_back(intervals[i]);
}
}
return ans;
}
};
二维数组按列排序
sort(intervals.begin(),intervals.end(),[](const vector<int> &a,const vector<int> &b){return a[0]<b[0];});
sort函数的使用
- 包含头文件
#include <algorithm>
sort(begin,end)
,默认升序sort(begin,end,cmp)
,可自己写一个cmp函数,调用时写函数名,不加括号。
//这里返回的是一个bool类型
bool cmp(int x,int y)//重新定义排序方式,记住
{
undefined
return x > y;//从大到小排序
}