题目描述
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]
解题思路
这道题其实就是区间合并的问题,其实思路很简单,首先把数组中的interval按照interval的start进行排序 ,然后建立一个栈,将数组中的interval和栈中最后一个元素进行比较:
如果数组中的interval(简称aInterval)的start和end均小于栈中的interval(简称sInterval)则不做变化;
如果aInterval的start小于sInterval的end,但是aInterval.end>sInterval则合并;
如果aInterval.start>sInterval.end则入栈
代码
/**
* 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(Interval a,Interval b){
return a.start<b.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> result;
if(intervals.size()==0) return result;
sort(intervals.begin(),intervals.end(),cmp);
result.push_back(intervals[0]);
for(int i=1;i<intervals.size();i++){
if(intervals[i].start==result.back().start&&intervals[i].end>result.back().end){
result.back().end=intervals[i].end;
}
else if(intervals[i].start<=result.back().end){
if(intervals[i].end>result.back().end){
result.back().end=intervals[i].end;
}
else
continue;
}
else if(intervals[i].start>result.back().end){
result.push_back(intervals[i]);
}
}
return result;
}
};
Insert Interval这道题和上面这道题很相似。
Insert Interval的题目描述是在一群排序好的无交叉的区间之内插入一个区间,并合并。这道题的解题思路可以是把原始区间数组和新的区间放在一起,进行排序,然后按照merge Intervals的方法进行处理。
但是这样时间复杂度比较高,第二种方法是:
将区间数组中的区间a和目标区间t进行比较:
如果t小于a则把t插入结果中;
如果t大于a则把a插入结果中;
如果t和a有交叉,则进行合并。
代码如下:
/**
* 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(Interval a,Interval b){
return a.start<b.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> result;
if(intervals.size()==0) return result;
sort(intervals.begin(),intervals.end(),cmp);
result.push_back(intervals[0]);
for(int i=1;i<intervals.size();i++){
if(intervals[i].start==result.back().start&&intervals[i].end>result.back().end){
result.back().end=intervals[i].end;
}
else if(intervals[i].start<=result.back().end){
if(intervals[i].end>result.back().end){
result.back().end=intervals[i].end;
}
else
continue;
}
else if(intervals[i].start>result.back().end){
result.push_back(intervals[i]);
}
}
return result;
}
};