给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
思路:在这里我们先需要对这个vector进行排序,自己写一个仿函数,然后将interval的start作为排序的依据,这样子就可以将vector通过interval里面的start从小到大排序了,然后再遍历这个vector,如果发现前一个的interval中的end值比后一个的start值大,则更新此时的temp,此时的temp就将两个interval合并成了一个,这时候需要往后继续进行判断,看是否还存在这种情况,有的话就再更新,直到不出现为止,最后这个temp是一个或多个interval合并的结果,将它压入目标vector中,再更新此时i值,进行下一轮搜查。
/**
* 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 mySort(const Interval & a,const Interval & b)
{
return a.start < b.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> vecRes;
if(intervals.empty())
return vecRes;
int nCount = intervals.size();
sort(intervals.begin(),intervals.end(),mySort);
int i=0;
while(i<nCount)
{
auto temp = intervals[i];
int j = i+1;
while(j<nCount && temp.end >= intervals[j].start)
{
temp.end = max(temp.end,intervals[j].end);
j++;
}
vecRes.push_back(temp);
i=j;
}
return vecRes;
}
};