题目:给出一个区间集合,求合并所有重叠后的区间。
分析:区间处理先上套路,按左端点作第一维,右端点作第二维进行排序。依次考察每个区间,假设前面所有区间合并后是[left, right],若当前区间的左端点小于等于right,right=max(right, 当前区间的右端点);否则说明有空格,将[left, right]加入答案,新区间作为[left, right]。
class Solution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { int n = intervals.size(); if(n == 0) return {}; vector<vector<int>>ans; vector<pair<int, int>>myinter; for(int i = 0;i < n;i++) myinter.push_back(make_pair(intervals[i][0], intervals[i][1])); sort(myinter.begin(), myinter.end()); int left = myinter[0].first, right = myinter[0].second; for(int i = 1;i < n;i++) { if(myinter[i].first <= right) right = max(right, myinter[i].second); else { ans.push_back(vector<int>{left, right}); left = myinter[i].first; right = myinter[i].second; } } ans.push_back(vector<int>{left, right}); return ans; } };
推荐用pair实现,因为pair会自动将first作第一关键字,second作第二关键字排序,这样就不用自己写个cmp函数。