1. 题目
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].
2. 思路
先排序,排序规则是start小的在前,如果start相等则end大的在前。
然后从前往后遍历,如果当前要处理的节点可以归并到当前已归并的末节点上,则归并上去。
最后将已归并节点之后的空间清掉。
3. 代码
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
bool cmp(Interval& i, Interval& j) {
return i.start < j.start || i.start == j.start && i.end > j.end;
}
class Solution {
public:
// 先排序, 起点小终点大在前。
// 然后从前往后遍历, 将可以归并的点进行归并填入,最后多出来的元素删掉
vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.size() == 0) { return intervals; }
sort(intervals.begin(), intervals.end(), cmp);
int fill = 0;
int merge = 1;
while (merge < intervals.size()) {
Interval& fi = intervals[fill];
Interval& mi = intervals[merge];
if (fi.end >= mi.start) {
if (mi.end > fi.end) {
fi.end = mi.end;
}
} else {
fill++;
if (fill != merge) {
intervals[fill] = intervals[merge];
}
}
merge++;
}
intervals.resize(fill+1);
return intervals;
}
};