合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
区间是一个结构体
/**
* 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:
vector<Interval> merge(vector<Interval>& intervals) {
}
};
思路: 先以 start 为基准, 对区间从小到大排序
定义一个 vector 存放结果, 先把第一个区间加入结果
拿第二个区间的 start 和 结果中当前区间的 end 比较
如果 start 大于 end, 就直接把第二个区间放进结果中
否则将当前结果区间的 end 和第二个区间的 end 比较, 较大者作为合并区间的 end
每次加入新区间时都如此比较, 直到所有区间加入结果中, 合并完毕
实现代码:
struct comp
{
bool operator() (const Interval& l, const Interval& r)
{
return l.start < r.start;
}
} comp;
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> ret;
int size = intervals.size();
if( size == 0 )
return ret;
// 先以 start 为基准升序排序
sort(intervals.begin(), intervals.end(), comp);
// 1. 定义一个 vector 存放结果, 先把第一个区间加入结果
ret.push_back(intervals[0]);
int ret_size;
// 2. 拿第二个区间的 start 和 结果中当前区间的 end 比较
for(int i = 1; i < size; i++)
{
ret_size = ret.size(); // 每次都拿结果中的最后一个区间去和新的区间比较
// 如果 start 大于 end, 就直接把第二个区间放进结果中
// 否则将当前结果区间的 end 和第二个区间的 end 比较, 较大者作为合并区间的 end
// 3. 每次加入新区间时都如此比较, 直到所有区间加入结果中, 合并完毕
if(intervals[i].start > ret[ret_size-1].end)
{
ret.push_back(intervals[i]);
}
else
{
ret[ret_size-1].end = max(intervals[i].end, ret[ret_size-1].end);
}
}
return ret;
}
};