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].


 CSDN博客挂了,可能是和新浪接口那边出了问题,我是用新浪帐号登录的。
 首先,是合并的规则
if(A.end<B.end&&A.end>B.start)
{
if(A.start<B.start)
B.start=A.start;
}//A的end在B的范围里面
if(A.start>B.start&&A.start<B.end)
{
if(A.end>B.end)
B.end=A.end
}//如果A的start在B的范围里面
还有一个不要漏掉了,就是B是被A包含的,即A.start<B.start&&A.end>B.end
一开始漏掉了最后一个条件判断。
所以相比之下还是比较喜欢这个而不是acm,因为acm错误的话没有给出例子。

其次是运算规则,
1:从示例中提出去第一个范围,然后依次和剩下的范围合并,从原来的示例中移去合并过的范围。
2:直至遍历一遍后。把这个新的范围加到结果集中。
3:依次重复以上步骤。

在这里,是另一个坑。因为示例给的范围可能是未排序的,因此有可能出现这种情况:
[[1,2],[3,4],[5,6],[7,8],[1,10]]
如果按照上面的结果,那么就会出现
结果为[[1,10],[3,4],[5,6],[7,8]]
因为第一次遍历后把[1,10]给移出,并且不会出现在后面的任何计算中。
因此,参考Floyd算法,对结果进行再次的合并。
重复的次数为一开始实例的子集个数。

这样子复杂度是O(n^3)
有点高,改进的话,应该是先开始对范围进行排序

还有一个小的地方要注意,在对List进行remove操作,位置i应该--后再++
比如remove(i);i++

这个时候,i实际上是指向原来i后面的第二个而不是i后面的第一个。

上代码:


import java.util.ArrayList;
import java.util.List;

import javax.swing.text.StyledEditorKit.ForegroundAction;

public class 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.
	public class Interval {
		int start;
		int end;

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

		Interval(int s, int e) {
			start = s;
			end = e;
		}
	}

	public class Solution {
		public List<Interval> mergetmp(List<Interval> intervals) {
			List<Interval> resultIntervals = new ArrayList<Interval>();
			for (; intervals.size() > 0;) {
				Interval intervaltmp = intervals.remove(0);
				for (int i=0;i<intervals.size();++i) {
					if (intervals.get(i).end <= intervaltmp.end
							&& intervals.get(i).end >= intervaltmp.start) {
						if (intervals.get(i).start <= intervaltmp.start)
							intervaltmp.start = intervals.get(i).start;
						
						intervals.remove(i);
						i--;
						
					}else
					if (intervals.get(i).start >= intervaltmp.start
							&& intervals.get(i).start <= intervaltmp.end) {
						if (intervals.get(i).end >= intervaltmp.end)
							intervaltmp.end = intervals.get(i).end;
						intervals.remove(i);
					    i--;
					}else 
				if(intervals.get(i).start<=intervaltmp.start&&intervals.get(i).end>=intervaltmp.end){
						intervaltmp.start=intervals.get(i).start;
						intervaltmp.end=intervals.get(i).end;
						intervals.remove(i);
						i--;
					}
				}
				resultIntervals.add(intervaltmp);
			}

			return resultIntervals;
		}
		public List<Interval> merge(List<Interval> intervals){
			List<Interval> resultIntervals = intervals;
			int count=intervals.size();
			for(int i=0;i<count;++i){
				resultIntervals=mergetmp(resultIntervals);
			}
			return resultIntervals;
			
			
		}
		
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值