标签:merge
Merge Intervals : https://leetcode.com/problems/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].
解析:
容易想到,先按start对各区间排序,然后比较相邻的2个区间的end和start的大小,如果intervals[i].end >= intervals[i+1].start 则可以合并,但需要注意的是,如果intervals[i].end >= intervals[i+1].end,则前一个完全包含后一个,因此在判断能够合并时,还要判断存在完全包含的情况,如果不包含,才需要改变前一个的end。
e.g.
另外,在以下程序中,用额外空间result保存最终结果。
如果在Intervals中原位保存结果,则需要释放掉被重叠的项,我们知道vector是数组形式,每删除一项就是O(n),因此不建议这样做(事实是,leetcode 也会超时)。
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
// 时间O(n),空间O(n)
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.size() <= 1)
return intervals;
vector<Interval> result;
sort(intervals.begin(), intervals.end(), cmp);
result.push_back(intervals[0]);
int j = 1;
while (j < size) {
Interval &p = result.back();
if (p.end >= intervals[j].start) {
if (p.end < intervals[j].end)
p.end = intervals[j].end;
} else {
result.push_back(intervals[j]);
}
j++;
}
return result;
}
public:
static bool cmp(const Interval& i1, const Interval& i2) {
return i1.start < i2.start;
}
};
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:merge
原文地址:http://blog.csdn.net/quzhongxin/article/details/47058359