解法一:
题目所给区间并非有序,首先要给区间排序,按照每项interval的start值,使用lambda函数定义规则:
[](Interval &a, Interval &b) {return a.start < b.start;}
将start值小定义为小。
排序后将res设为intervals的第一项,从第二项到末尾遍历intervals,若遍历到的当前项和res最后一项有重叠,更新res末项end值,否则将当前项加入res,代码如下:
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.empty()) return {};
sort(intervals.begin(), intervals.end(), [](Interval &a, Interval &b){return a.start < b.start;});
vector<Interval> res{intervals[0]};
for(int i=1;i<intervals.size();i++){
if(res.back().end>=intervals[i].start){
res.back().end=max(res.back().end,intervals[i].end);
}
else
res.push_back(intervals[i]);
}
return res;
}
};
解法二
下面这种解法将起始位置和结束位置分别存到了两个不同的数组starts和ends中,然后分别进行排序,之后用两个指针i和j,初始化时分别指向starts和ends数组的首位置,然后如果i指向starts数组中的最后一个位置,或者当starts数组上i+1位置上的数字大于ends数组的i位置上的数时,此时说明区间已经不连续了,我们来看题目中的例子,排序后的starts和ends为:
红色为i的位置,蓝色为j的位置,那么此时starts[i+1]为8,ends[i]为6,8大于6,所以此时不连续了,将区间[starts[j], ends[i]],即 [1, 6] 加入结果res中,然后j赋值为i+1继续循环,参见代码如下:
class Solution {
public:
vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.empty()) return {};
vector<Interval> res;
vector<int> starts,ends;
for(int i=0;i<intervals.size();i++){
starts.push_back(intervals[i].start);
ends.push_back(intervals[i].end);
}
sort(starts.begin(),starts.end());
cout<<starts[0];
sort(ends.begin(),ends.end());
for(int i=0,j=0;i<intervals.size();i++){
if(starts[i+1]>ends[i]||i==intervals.size()-1){
res.push_back(Interval(starts[j],ends[i]));
j=i+1;}
}
return res;
}
};