-
题目:
vector<vector> intervals的每一个元素intervals[ i ] : intervals[ i ] [ 0] , intervals[ i ] [ 1 ]表示一个区间范围;
把有重复部分的区间合并成一个大区间,并返回合并后的vector<vector>; -
思路:
先排序,规则是:按区间起点从小到大排序,起点相同的区间,按终点从小到大排序;
从前往后遍历,若有重叠,就合并;若没重叠,说明不能合并,就把前面已经合并的部分添加进结果集;
class Solution {
public:
//排序
//记录l和maxR
//若有重复区间, 就把前面的[l, maxR]合并成一个; 否则就不断延长maxR
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res;
if (intervals.empty()) return res;
sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){ return a[0] == b[0] ? a[1] < b[1] : a[0] < b[0]; });
int l = intervals[0][0], maxR = intervals[0][1];
for (int i = 1; i < intervals.size(); ++i) {
if (intervals[i][0] > maxR) { //若跟前面区间没重叠,就把前面的合并为一个并添加进res,同时设置新区间的起始位置;
res.push_back(vector<int>{l, maxR});
l = intervals[i][0];
}
maxR = max(maxR, intervals[i][1]); //若跟前面区间有重叠,就延申右边界;
}
res.push_back(vector<int>{l, maxR}); //最后还有一段没添加
return res;
}
};