56. Merge Intervals题解
题目描述:
Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
题目链接:56. Merge Intervals
算法描述:
由题意知,给定一个包含几块区间的集合,我们将对那些在各自区间上有重叠的集合进行合并,返回的整理之后的区间集合。
我们按照这样的思路来做:创建一个返回集合 ans。首先对集合中的区间进行排序,首项小的区间放在前面。排序完之后,依次进行比较,如果前一个区间的尾项小于后一个区间的首项,则将前一个区间放入集合 ans,之后继续进行。否则,对两个区间进行合并:对前一个区间的尾项进行修改,取前一个尾项和后一个尾项的最大值,前一个区间的首项不变,合并完成。
依次进行,最后需要将集合的最后一个区间放入 ans 集合。
代码:
/**
* 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 int func_compare(Interval a, Interval b){
return a.start<b.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> ans;
if (intervals.size()<=1){
return intervals;
}
sort(intervals.begin(),intervals.end(), func_compare);
Interval black=intervals[0];
int i=1;
while(i<intervals.size()){
if (black.end<intervals[i].start){
ans.push_back(black);
black=intervals[i];
}
else{
black.end=max(black.end,intervals[i].end);
}
i++;
}
ans.push_back(black);
return ans;
}
};