问题描述:
给出若干闭合区间,合并所有重叠的部分。
样例
给出的区间列表 => 合并后的区间列表:
[ [
[1, 3], [1, 6],
[2, 6], => [8, 10],
[8, 10], [15, 18]
[15, 18] ]
]
解题思路:
建立一个区间类型的向量,将最终合并好的区间放入。首先将给定的区间按照区间下限从小到大排序,然后建立一个循环,从第一个区间开始看下一个区间的下限是否小于上一个区间的上限,如果小于则将两个区间合并,同时合并好的区间上下限都发生改变。否则将该区间直接放入向量内。判断完成后,继续将下一个区间与合并后的新区间进行比较,直到所有区间都完成比较。
代码实现:
/**
* Definition of Interval:
* classs Interval {
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
*/
class Solution {
public:
/**
* @param intervals: interval list.
* @return: A new interval list.
*/
static bool compare(const Interval &a, const Interval &b){
return a.start<b.start;
}
vector<Interval> merge(vector<Interval> &intervals) {
// write your code here
vector<Interval> lz;
int n=intervals.size();
if(n<1) return lz;
sort(intervals.begin(), intervals.end(), compare);
int l=intervals[0].start;
int r=intervals[0].end;
for(int i=1;i<n;i++){
if(intervals[i].start<=r){
r=max(r,intervals[i].end);
}
else {
lz.push_back(Interval(l,r));
l=intervals[i].start;
r=intervals[i].end;
}
}
lz.push_back(Interval(l,r));
return lz;
}
};
解题感悟:
考虑给定的区间为空的情况;给区间排序时要写一个函数compare,使区间按照下限从小到大的顺序排列。