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]
.
一开始sb了 用数组代表坐标记录覆盖地点,然后单独处理开始等于结束的点
/**
* 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:
void setbit(char* array,int begin,int end)
{
for(int i=begin;i<end;++i)
{
array[i] = 1;
}
}
vector<Interval> merge(vector<Interval> &intervals) {
size_t LEN = 65535;
vector<Interval> vec;
set<int> same;
char array[LEN];
memset(array,0,sizeof(char)*LEN);
vector<Interval>::iterator i = intervals.begin();
for(i;i!=intervals.end();++i)
{
if((*i).start == (*i).end)
{
same.insert((*i).start);
}
setbit(array,(*i).start,(*i).end);
}
int tmp = 0;
int start,end;
bool isstart = false;
int c = 0;
set<int>::iterator it = same.begin();
while(it!=same.end())
{
if((*it > 0) && (array[(*it)]||array[((*it) - 1)]) || (*it==0 && array[0]))
same.erase(it++);
else
++it;
}
for(set<int>::iterator it = same.begin();it!=same.end();++it)
{
Interval *interval = new Interval(*it,*it);
vec.push_back(*interval);
}
for(int n=0;n<LEN;++n)
{
if(tmp!=array[n])
{
if(!isstart)
{
start = n;
isstart = true;
}
else
{
end = n;
isstart = false;
Interval *interval = new Interval(start,end);
vec.push_back(*interval);
}
}
tmp = array[n];
}
return vec;
}
};
觉得不能这么长 看了discuss 原来就是merge过程 然后自己写了个merge 好短= =、
bool CMP(const Interval& it1,const Interval& it2)
{
if(it1.start!=it2.start)
return it1.start < it2.start;
else
return it1.end < it2.end;
}
class Solution {
public:
vector<Interval> merge(vector<Interval> &intervals) {
vector<Interval> rsvec;
if(intervals.size()==0)
return rsvec;
std::sort(intervals.begin(),intervals.end(),CMP);
int startp=(intervals.begin())->start,endp=(intervals.begin())->end;
if(intervals.size()==1)
{
rsvec.push_back(*(new Interval(startp,endp)));
return rsvec;
}
vector<Interval>::iterator i=intervals.begin();
for(i;i!=intervals.end();++i)
{
if((*i).start > endp)
{
rsvec.push_back(*(new Interval(startp,endp)));
startp = (*i).start;
endp = (*i).end;
}
else if((*i).end > endp)
endp = (*i).end;
}
rsvec.push_back(*(new Interval(startp,endp)));
return rsvec;
}
};