Leetcode题目:Merge Intervals
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].
分析:
这是Leetcode排序题中的一道,属于medium难度,主要就是将单个数据排序拓展为由两个数据组成的区间的排序与合并。其实本质上是一样的,关键是先将它转化成普通排序问题,然后再根据区间之间的包含、交叉、不相交三种情况进行区间合并,就非常简单了!
具体做法:
step1: 把所有intervals按start的值升序排列。
step2: 遍历所有相邻interval,比较当前interval的start值和之前最大的end值的大小,从而确定区间之间的包含、交叉、不相交关系,将包含或交叉的区间合并。
C++代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
/*自定义vector的排序函数,用区间的左值来先从小到大排序*/
bool less_first(const Interval& in1, const Interval& in2){
return in1.start < in2.start;
}
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.empty()) return intervals; //单独处理读入空区间的情况
/*把所有区间按左值start从小到大排序*/
sort(intervals.begin(), intervals.end(), less_first);
vector<Interval> new_intervals;
int start = intervals[0].start;
int end = intervals[0].end;
for (int i = 1; i < intervals.size(); i++){
/*两区间不相交*/
if (intervals[i].start > end){
Interval new_interval(start, end);
new_intervals.push_back(new_interval); //将确定好的前一个区间push到新区间序列里
start = intervals[i].start;
end = intervals[i].end;
}
/*两区间相交的前提下,判断是包含还是交叉,从而确定end的值*/
else{
end = end > intervals[i].end ? end : intervals[i].end;
}
}
/*生成最后的一个区间并放到区间序列的末尾*/
Interval new_interval(start, end);
new_intervals.push_back(new_interval);
return new_intervals;
}
};