【leetcode】56. 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].

翻译:

函数的输入是一些无序区间的集合,需要我们做的是将区间进行合并,输出合并后的区间的集合。

思路:

1.一开始的思路是集合中的区间[start,end],先按照start进行排序,start小的在左边,start大的在右边,然后从左往右挨个进行合并即可,这种方法是可行的,而且c++的sort函数允许自己定义sort的规则。但是这种方法在大数据时runtime error了,不懂是啥情况,可能是因为自定义排序在大数据下有问题。先把这个思路的代码贴上:

bool compare(const Interval& i1,const Interval& i2)
{
	return i1.start>=i2.start;
}


class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
		if(intervals.size()<=1)
			return intervals;
		vector<Interval>::iterator before_it=intervals.begin();
		vector<Interval>::iterator after_it=intervals.begin()+1;
		int low,high;
        sort(intervals.begin(),intervals.end(),compare);
		for (;after_it!=intervals.end();)
		{
			if(before_it->end>=after_it->start)
			{
				low=min(before_it->start,after_it->start);
				high=max(before_it->end,after_it->end);
				before_it=intervals.erase(before_it);
				after_it=before_it+1;
				continue;
			}
			before_it++;
			after_it++;
		}
		return intervals;
		
    }
};


2.无奈之下,我就放弃先排序的想法,直接合并,但是直接合并不能单纯地从左往右合并,需要考虑这种情况:[2,3][4,5][6,7][8,9][1,10],前四个无法合并,但是[1,10]可以把前几项全都合并,因此每当出现能够合并的情况需要遍历result,将所有能够合并的情况都包括进来。代码:

class Solution {
public:
    vector<Interval> merge(vector<Interval>& intervals) {
		if(intervals.size()<=1)
			return intervals;
		//sort(intervals.begin(),intervals.end(),compare);
		vector<Interval> result;
		int low,high;
		bool if_insert=false;
		//vector<Interval>::iterator it=intervals.begin();
		for (int i=0;i<intervals.size();i++)
		{
			for (int j=0;j<result.size();j++)
			{
				if(intervals[i].end<result[j].start)
				{
					result.insert(result.begin()+j,intervals[i]);
					if_insert=true;
					break;
				}
				else if (intervals[i].start>result[j].end)
				{
					continue;
				}
				else
				{
					result[j].start=min(intervals[i].start,result[j].start);
					result[j].end=max(intervals[i].end,result[j].end);
					for (int k=j+1;k<result.size();k++)
					{
						if (!(result[k].start>result[j].end))
						{
							result[j].start=min(result[k].start,result[j].start);
							result[j].end=max(result[k].end,result[j].end);
							result.erase(result.begin()+k);
							k--;
						}
					}

					if_insert=true;
					break;
				}
			}
			if(!if_insert)
				result.push_back(intervals[i]);
			if_insert=false;
		}
		return result;
		
    }
};

结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值