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) {}
* };
*/
bool cmp(Interval I1, Interval I2)
{
return I1.start<I2.start;
}
class Solution {
public:
vector<Interval> merge(vector<Interval> &intervals)
{
int cur = 0;
vector<Interval> res;
if (intervals.empty())
return res;
sort(intervals.begin(), intervals.end(), cmp);
Interval tmp(intervals[0].start, intervals[0].end);
for (int i=0;i<intervals.size()-1;i++)
{
if(tmp.end>=intervals[i+1].start)//一定要用tmp比较
{
tmp.start = min(tmp.start, intervals[i+1].start);//一定要用tmp比较
tmp.end = max(tmp.end, intervals[i+1].end);//一定要用tmp比较
}
else
{
res.push_back(tmp);
tmp.start = intervals[i+1].start;
tmp.end = intervals[i+1].end;
}
}
res.push_back(tmp);
return res;
}
};
测试
#include<algorithm>
#include<iostream>
#include<vector>
#include<limits.h>
using namespace std;
struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
bool cmp(Interval I1, Interval I2)
{
return I1.start<I2.start;
}
class Solution {
public:
vector<Interval> merge(vector<Interval> &intervals)
{
int cur = 0;
vector<Interval> res;
if (intervals.empty())
return res;
sort(intervals.begin(), intervals.end(), cmp);
Interval tmp(intervals[0].start, intervals[0].end);
for (int i=0;i<intervals.size()-1;i++)
{
if(tmp.end>=intervals[i+1].start)
{
tmp.start = min(tmp.start, intervals[i+1].start);
tmp.end = max(tmp.end, intervals[i+1].end);
}
else
{
res.push_back(tmp);
tmp.start = intervals[i+1].start;
tmp.end = intervals[i+1].end;
}
}
res.push_back(tmp);
return res;
}
};
int main()
{
Solution s;
vector<Interval> intervals;
Interval tmp1(0,2);
intervals.push_back(tmp1);
Interval tmp2(1,4);
intervals.push_back(tmp2);
Interval tmp3(3,5);
intervals.push_back(tmp3);
// Interval tmp4(18,19);
//intervals.push_back(tmp4);
vector<Interval>res = s.merge(intervals);
for (int i=0;i<res.size();i++)
{
cout<<"start :"<<res[i].start<<" next :"<<res[i].end<<endl;
}
}