Problem:
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]
.
bool myCompare(Interval a, Interval b){
return a.start < b.start;
}
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if(intervals.size() < 2) return intervals;
vector<Interval> ans;
sort(intervals.begin(), intervals.end(), myCompare);
Interval temp = intervals[0];
for(int i = 1; i < intervals.size(); i++){
if(temp.end < intervals[i].start){
ans.push_back(temp);
temp = intervals[i];
}else{
temp.end = max(temp.end, intervals[i].end);
}
}
ans.push_back(temp);
return ans;
}
};
Solution2:
/**
* 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) {
if(intervals.size() < 2) return intervals;
vector<int> start, end;
for(auto s : intervals){
start.push_back(s.start);
end.push_back(s.end);
}
sort(start.begin(), start.end());
sort(end.begin(), end.end());
vector<Interval> ans;
Interval temp;
int i = 0;
while(i < start.size()){
temp.start = start[i];
while(i < start.size() - 1 && start[i + 1] <= end[i])
i++;
temp.end = end[i];
ans.push_back(temp);
if(i == start.size() - 1)
break;
else i++;
}
return ans;
}
};