主题:
学习记录,内容
- 算法题:合并区间
内容:
1 合并区间
问题描述:
给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。
思路:
要先进行排序,是对于Interval的排序。按照地一个元素升序进行排序。实现排序
最简单的办法就是使用sort这个函数,重写compare函数。注意应该怎么写。返回值最好是
bool类型的。当a>b返回true时,那么就会是降序的排列。如果是false,那么就是降序的排列。
1可以替代true,0可以替代false。(非零即为true)
排玩序之后需要进行合并,合并需要“累积合并”。也就是之前合并的结果来和下一个interval进行合并。
合并之后要决定是直接添加到res里面,还是把旧的扔掉,然后进行新的,也就是进行更新。
或者是不需要进行变更。(为了简单,不须变更的情况也作为更新的情况)
有三种基本的情况,这里做图理解是一个非常好的办法。很多问题都需要进行做图理解,会更好理解。
代码:
vector<Interval> merge(vector<Interval> &intervals) {
if(intervals.size()<=1)
{
return intervals;
}
//需要将Interval进行排序
sort(intervals.begin(), intervals.end(),compare);
//进行合并
vector<Interval> res;
Interval v = intervals[0];
Interval temp;
res.push_back(v);
for(unsigned long i=1;i<intervals.size();i++)
{
temp = v;
v = merge(v, intervals[i]);
if(v.start == temp.start && v.end == intervals[i].end || v.start == temp.start && v.end == temp.end)
{ //没有进行合并
res.pop_back();
res.push_back(v);
}
else{ //有合并
res.push_back(v);
}
}
return res;
}
static bool compare(Interval& i1, Interval& i2)
{
return i1.start<i2.start; //这个函数返回值可以是int,也可以是bool,可以正排,也可以倒排
}
Interval merge(Interval&v1, Interval& v2) //对两个Interval进行合并
{
if(v2.start <= v1.end)
{
if(v2.end < v1.end)
{
return v1;
}
else{
return Interval(v1.start, v2.end);
}
}
else{
return v2;
}
}