[leetcode]Merge Intervals

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;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值