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,3],[1,2],[1,1],[2,6],[8,10],[15,18],合并的时候[1,2]合并到[1,3]里面,因为进行了合并操作,所以仍然会往下扫描下一个区间。

排序以后从前往后扫描,对有交叉的区间进行合并,因为排过序!最后能够合并成一个区间的所有区间一定能够在一次循环中检测到!

public List<Interval> merge(List<Interval> intervals)
	{
		Collections.sort(intervals,new mycomparator1());
		List<Interval> retlist=new ArrayList<>();
		int len=intervals.size();
		boolean[] used=new boolean[len];
		
		for(int i=0;i<len;i++)
			if(!used[i])
			{
				used[i]=true;
				Interval in1=intervals.get(i);
				int newstart=in1.start;
				int newend=in1.end;
				for(int j=i+1;j<len;j++)
					if(!used[j])
					{
						Interval in2=intervals.get(j);
						if(in2.start<=newend)
							{
								newend=Math.max(newend, in2.end);
								used[j]=true;
							}
						else {
							break;
						}
					}
				retlist.add(new Interval(newstart, newend));
			}
		return retlist;
	}

class mycomparator1 implements Comparator<Interval>
{
	@Override
	public int compare(Interval o1, Interval o2)
	{
		if(o1.start<o2.start)
			return -1;
		if(o1.start>o2.start)
			return 1;
		return 0;
	}
}

class Interval
{
	int start;
	int end;

	Interval()
	{
		start = 0;
		end = 0;
	}

	Interval(int s, int e)
	{
		start = s;
		end = e;
	}
	
	@Override
	public String toString()
	{
		// TODO Auto-generated method stub
		return "["+start+","+end+"]";
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值