1.这道题目没有想象中难。
2.首先初始化start和cover,对于区间[start,cover]和区间[start2,end2]把小于等于cover的start2的区间,进行合并,成为[start,max(cover,end2)];然后重复这个步骤。不能合并则表示没有交集,压入答案。
3.实现2算法的前提是,数组按照start从小到大排列,这个时候需要重写cmp函数,由于需要写在class里面,所以需要添加static。
4.遍历一遍即可,时间复杂度为O(n)。
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]
.
AC代码:
[c language=”++”]
/**
* 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:
static bool cmp(const Interval&a, const Interval&b)
{//需要使用static采用调用
return a.start < b.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
vector<Interval> result(0);
int start=0, cover=0;//通过不断覆盖起始点,来扩大覆盖范围,譬如[1,6]和[2,7],cover=6>=2,所以合并两个区间,cover变成7
int n = intervals.size();
if (n != 0)
{//注意初始化
start = intervals[0].start;
cover = intervals[0].end;
}
else if(n==0) return intervals;//注意空时返回空
for (int i = 1; i < n; i++)
{//n>=2
if (intervals[i].start <= cover)//取能覆盖的最大范围
cover = max(cover, intervals[i].end);
else
{//intervals[i].start > cover,不能覆盖,压入[start,cover],然后更新start和cover
result.push_back(Interval(start, cover));
start = intervals[i].start;
cover = intervals[i].end;
}
}
result.push_back(Interval(start, cover));
return result;
}
};
[/c]