题名:Merge Intervals
难度:Medium
题目描述:
代码如下:
/**
* 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) {
if(intervals.empty()){
return vector<Interval>{};
}
//先对intervals进行排序,简化之后的比较合并步骤,注意设置Interval变量的比较规则
sort(intervals.begin(), intervals.end(), [](Interval a, Interval b){return a.start < b.start;});
vector<Interval> newIntervals;
newIntervals.push_back(intervals[0]);
int n = 0;
for(int i = 1; i < intervals.size(); i++){
//满足合并要求
if(newIntervals[n].end >= intervals[i].start){
int start, end;
//比较决定合并的新的Interval的start和end,start取较小值,end取较大值
start = (newIntervals[n].start < intervals[i].start)? newIntervals[n].start : intervals[i].start;
end = (newIntervals[n].end > intervals[i].end)? newIntervals[n].end : intervals[i].end;
Interval inter(start, end);
//将合并的新元素取代旧元素
newIntervals.erase(newIntervals.begin()+n);
newIntervals.push_back(inter);
}
else{ //不符合合并要求,直接将该元素加入newIntervals
newIntervals.push_back(intervals[i]);
n++;
}
}
return newIntervals;
}
};
个人体会:
上面的代码及其注释展示了这道题的具体思路。注意要点是提前将原来的vector按照自己设定的规则进行排序,这样之后的合并条件判断将会非常简单:将newIntervals中的元素与原intervals的元素进行对比,如果存在交叉就进行合并,start取较小值,end取较大值;不存在交叉就直接加入newIntervals即可。