一、问题描述
给出若干闭合区间,合并所有重叠的部分。
样例
给出的区间列表 => 合并后的区间列表:
[ [
[1, 3], [1, 6],
[2, 6], => [8, 10],
[8, 10], [15, 18]
[15, 18] ]
]
首先,定义一个比较函数,方便用sort函数进行从小到大排序,定义vector容器,用来存储合并后的区间,定义left为新生成区间的左元素,right为新生成区间的右元素,然后开始对每个区间进行查找,若right大于等于区间开始的元素,也就是说下一个区间可以和当前的这个区间进行合并,然后令right=max(right,intervals[i].end),即进行完合并,若right小于当前区间开始的元素,直接把当前区间存入vector容器中,如此循环下去,直到查找完毕。
三、我的代码
class Solution {
public:
static bool compare(const Interval&a,const Interval&b)
{
return a.start<b.start;
}
/**
* @param intervals: interval list.
* @return: A new interval list.
*/
vector<Interval> merge(vector<Interval> &intervals) {
// write your code here
vector<Interval>rr;
int n=intervals.size();
if(n<1)
{
return rr;
}
sort(intervals.begin(),intervals.end(),compare);
int left=intervals[0].start;
int right=intervals[0].end;
for(int i=1;i<n;i++)
{
if(intervals[i].start<=right)
{
right=max(right,intervals[i].end);
}
else
{
rr.push_back(Interval(left,right));
left=intervals[i].start;
right=intervals[i].end;
}
}
rr.push_back(Interval(left,right));
return rr;
}
};
四、我的感想
在编程过程中,要注意right的更新,然后是分类讨论,首先要进行对各个区间的排序,以方便之后的操作。