Merge Intervals
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]
.
解题思路:先将数组排序存入栈中,然后每次取出两个元素,判断第一个元素与第二个元素是否可以合并,如果不可以合并,则将第一个元素
入目标容器,然后将第二个元素赋值给第一个,如果可以合并,构造出合并后的新元素,再将新元素赋给第一个元素。
/**
* 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:
typedef struct mCompFunc{
bool operator()(Interval a, Interval b){
return a.start < b.start;
}
}mCompFunc;
vector<Interval> merge(vector<Interval> &intervals) {
vector<Interval> vi;
stack<Interval> si;
size_t n = intervals.size();
if(n <= 1) return intervals;
std::sort(intervals.begin(), intervals.end(), mCompFunc());
//将元素导入栈中
for(int i = n - 1; i >= 0; i--){
si.push(intervals[i]);
}
Interval a, b;
a = si.top(); si.pop();
while(!si.empty()){
b = si.top(); si.pop();
if(a.end < b.start){
//第一个元素与第二个元素不可以合并,将第一个存起来
vi.push_back(a);
a = b; //此时第一个指向第二个
}else{
int end = b.end; //可以合并且判断最远的距离是一大还是二大
if(a.end > b.end){ end = a.end; }
Interval tInterval(a.start, end);
a = tInterval; //第一个元素指向合并后的元素
}
}
vi.push_back(a); //将最后的一个入目标容器
return vi;
}
};