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]
.
/**
* 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:
vector<Interval> merge(vector<Interval>& intervals) {
}
};
思路:按照第一个数排序,然后逐一比较尾和头,如果下一个的头大,那么不重叠,否则新的区域的尾应该是较大的那个尾。
AC代码:
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> res;
if(intervals.empty())
return res;
sort(intervals.begin(),intervals.end(),cmp);
res.push_back(intervals[0]);
for(int i=1;i<intervals.size();i++){
if(res.back().end<intervals[i].start)
res.push_back(intervals[i]);
else
res.back().end=max(res.back().end,intervals[i].end);
}
return res;
}
bool static cmp(struct Interval a,struct Interval b){
return a.start<b.start;
}
};
然后sort还有一种写法:
sort(ins.begin(), ins.end(), [](Interval a, Interval b){return a.start < b.start;});
C++的新特性。准备挖个坑写一写C++的新特性。。。(然而这和我用它来写算法题的初衷有什么关系呢。。。