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]
.
讲道理,下次我想挑几题hard的来试试了......
言归正传,这道题就是想让我们把重叠的分组都给合并了,先来段代码
/**
* 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:
vector<Interval> merge(vector<Interval>& intervals) {
int len = intervals.size();
vector<Interval> inter;
if(intervals.empty())
return inter;
sort(intervals.begin(), intervals.end(), [](Interval a, Interval b){return a.start < b.start;});
Interval temp = intervals[0];
for(int i = 0; i < len; i++){
temp = intervals[i];
for(int j = i + 1; j < len; j++){
if(temp.end >= intervals[j].start ){
if(temp.end <= intervals[j].end)
temp.end = intervals[j].end;
i++;
}
else break;
}
inter.push_back(temp);
}
return inter;
}
};
在这里,我用temp来储存每一个最终结果中的分组。然后用temp.end分别与其后面分组的start和end相比较,大于等于start且小于等于end,就把temp.end替换成end的值。只要有所重叠,就把下一个temp的初始位置加1(这里我说不太清楚,就是 每次外层循环时 temp = intervals[i],然后一旦重叠,就 i++)。
但在这里,我们很容易忽略一个点,就是题目中一开始给出的demo是排好序的,很容易让人产生一种不用排序的念头。但其实呢,还是得排序,由start的从小到大的排序。
大概就是这样吧emmmmm