Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]] Output: [[1,6],[8,10],[15,18]] Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]] Output: [[1,5]] Explanation: Intervals [1,4] and [4,5] are considerred overlapping.
将所有组合按升序排列,如果不符合升序则合并区间。
方法:首先对所有结构体按照start值从小到大排序,使用sort函数需要自己写比较函数。如果当前start值大于前一个组合的end值,则加入结果,否则比较一下当前的end值和前一个end值得大小,将较大的end值放在前一个组合的end中,实现区间合并。
/**
* 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 comp(Interval& a, Interval& b){
return a.start<b.start;//按照start的值进行升序排列
}
vector<Interval> merge(vector<Interval>& intervals) {
sort(intervals.begin(),intervals.end(),comp);
vector<Interval> res;
if(intervals.empty()) return res;
res.push_back(intervals[0]);
for(int i=1;i<intervals.size();i++){
//当前intervals中的start值大于前一个组合的end,则当前intervals放入结果
if(intervals[i].start>res.back().end) res.push_back(intervals[i]);
//当前intervals的start值小于等于前一个组合的end值,则将较大值放入前一个组合的end,实现区间合并
else if(intervals[i].start<=res.back().end){
res.back().end = max(res.back().end,intervals[i].end);
}
}
return res;
}
};