题目:
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]
.
翻译:
函数的输入是一些无序区间的集合,需要我们做的是将区间进行合并,输出合并后的区间的集合。
思路:
1.一开始的思路是集合中的区间[start,end],先按照start进行排序,start小的在左边,start大的在右边,然后从左往右挨个进行合并即可,这种方法是可行的,而且c++的sort函数允许自己定义sort的规则。但是这种方法在大数据时runtime error了,不懂是啥情况,可能是因为自定义排序在大数据下有问题。先把这个思路的代码贴上:
bool compare(const Interval& i1,const Interval& i2)
{
return i1.start>=i2.start;
}
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if(intervals.size()<=1)
return intervals;
vector<Interval>::iterator before_it=intervals.begin();
vector<Interval>::iterator after_it=intervals.begin()+1;
int low,high;
sort(intervals.begin(),intervals.end(),compare);
for (;after_it!=intervals.end();)
{
if(before_it->end>=after_it->start)
{
low=min(before_it->start,after_it->start);
high=max(before_it->end,after_it->end);
before_it=intervals.erase(before_it);
after_it=before_it+1;
continue;
}
before_it++;
after_it++;
}
return intervals;
}
};
2.无奈之下,我就放弃先排序的想法,直接合并,但是直接合并不能单纯地从左往右合并,需要考虑这种情况:[2,3][4,5][6,7][8,9][1,10],前四个无法合并,但是[1,10]可以把前几项全都合并,因此每当出现能够合并的情况需要遍历result,将所有能够合并的情况都包括进来。代码:
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if(intervals.size()<=1)
return intervals;
//sort(intervals.begin(),intervals.end(),compare);
vector<Interval> result;
int low,high;
bool if_insert=false;
//vector<Interval>::iterator it=intervals.begin();
for (int i=0;i<intervals.size();i++)
{
for (int j=0;j<result.size();j++)
{
if(intervals[i].end<result[j].start)
{
result.insert(result.begin()+j,intervals[i]);
if_insert=true;
break;
}
else if (intervals[i].start>result[j].end)
{
continue;
}
else
{
result[j].start=min(intervals[i].start,result[j].start);
result[j].end=max(intervals[i].end,result[j].end);
for (int k=j+1;k<result.size();k++)
{
if (!(result[k].start>result[j].end))
{
result[j].start=min(result[k].start,result[j].start);
result[j].end=max(result[k].end,result[j].end);
result.erase(result.begin()+k);
k--;
}
}
if_insert=true;
break;
}
}
if(!if_insert)
result.push_back(intervals[i]);
if_insert=false;
}
return result;
}
};
结果: