[Leetcode]-56 Merge Intervals

在解决这个问题的时候,我的思路是: Interval的形式为(start,end)

1)按照Interval的第一个数值start进行排序,得到排序后数组

2)现在对排序后的数组进行合并操作,我们想象有一条直线,所有的间隔都是线段

考虑一个间隔I1=(s1,e1)和它的后一个间隔I2=(s2,e2),因为已经排好序,所以s1<s2

当e1 < s2的时候,I1与I2不重合,根据有序性可知I2之后的间隔也与I1不重合,所以I1为目标数组中一个成员

当e1 > s2的时候,两者可以合并为新间隔(s1,maxend),maxend = max(e1,e2),再进行重复(2),考虑新间隔与后续间隔的合并

#include <iostream>
#include <string>
#include <vector>

using namespace std;

struct ListNode{
	int val;
	ListNode *next;
	ListNode(int x):val(x),next(NULL){}
};

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){
		int index = 0;
		int len = intervals.size();
		vector<Interval> sortedintervals;                //排序后的间隔数组
		vector<Interval> res;                            //返回的间隔数组
		for(int k = 0; k < len; ++k ){
			index = 0;
			for(int i = 0; i < intervals.size();++i){
				if(intervals[i].start <= intervals[index].start){
					index = i;
				}
			}
			sortedintervals.push_back(intervals[index]);
			cout << intervals[index].start << "," << intervals[index].end << endl;
			intervals.erase(intervals.begin()+index);
		}
		int i = 0;
		while(i < sortedintervals.size()){
			int si = i;    
			int newend = sortedintervals[si].end;
			while(newend >= sortedintervals[i+1].start && i < sortedintervals.size()-1){
					if(newend < sortedintervals[i+1].end)
						newend = sortedintervals[i+1].end;
					i++;
			}
			res.push_back(Interval(sortedintervals[si].start,newend)); 
			i = i+1;		
		}
		return res;
	}
};

int main(){

	vector<Interval> intervals,res;
	intervals.push_back(Interval(1,4));
	intervals.push_back(Interval(0,2));
	intervals.push_back(Interval(3,5));
	
	Solution* s = new Solution();
	res = s->merge(intervals);
	for(int i = 0; i< res.size();++i){
		cout<< res[i].start << "," << res[i].end << endl;
	}
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值