56. Merge Intervals
Given a collection ofintervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
/**
*Definition for an interval.
*struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
定义一个结构体,结构体包含两个int型的数字,表示开始和结束。
题目给定若干个这样的结构体进行输入,要求输出它们merge后的值。
算法思想:
所谓的merge操作,将两个符合条件的结构体进行合并,条件为:
若结构体A的end值大于结构体B的start值;
然后A和B就要进行合并,合并成一个新的C。
C.start = min(A.start,B.start)
C.end= max(A.end,B.end)
遍历一次数组,然后不断地进行merge操作即可,复杂度为O(nlong),花费在排序上比较大.
步骤
1. 将数组按照start的值进行升序,若start值相同,则按照end值进行升序
2. 遍历数组,进行merge操作。
/**
* 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 t1 , Interval t2){
return t1.start < t2.start;
}
vector<Interval> merge(vector<Interval>& inter) {
vector<Interval> r;
if(inter.size() < 2)return inter;
int endindex = inter.size();
sort(inter.begin(),inter.end(), cmp);
Interval now = inter[0] ;
for (int i = 1; i != endindex ; i++) {
Interval temp = inter[i] ;
if (temp.start > now.end) {
r.push_back(now);
now = temp;
continue;
}else{
now.end = max(temp.end, now.end);
}
}
r.push_back(now);
return r;
}
};