间隔问题2 [No. 57]

原创 2012年03月28日 12:59:29

问题:

给一组间隔,把这些间隔合并,使得间隔之间不会有重合。比如:[1, 5], [3, 8], [10, 20], [7, 9] 合并后变成 [1, 9], [10, 20]。

分析:

首先,因为我们需要判断是否两个间隔是否重合,这样才能合并,检查两个间隔是否重合的代码是:

	/*
	 * s1: start point of interval 1
	 * e1: end point of interval 1
	 * s2: start point of interval 2
	 * e2: end point of interval 2
	 */
	public boolean overlap(int s1, int e1, int s2, int e2) {
		return Math.max(s1, s2) < Math.min(e1, e2);
	}

然后,我们把间隔按照开始值排序,这样,从头开始检查,如果当前间隔和前一个间隔重合,就合并。否则,直接把它加入到list里面。

代码如下:

public class Test {
	//check whether the two intervals intersect
	public boolean overlap(Interval i1, Interval i2) {
		return Math.max(i1.start, i2.start) < Math.min(i1.end, i2.end);
	}
	
	//merge the intervals and return a new interval list without overlapping
	public void merge(ArrayList<Interval> list) {
		int currentPosition = 0;
		for (int i = 1; i < list.size(); i++) {
			//no intersection
			if (overlap(list.get(i), list.get(currentPosition)) == false) {
				currentPosition++;
			} else {
				//get the new interval
				int start = Math.min(list.get(i).start, list.get(currentPosition).start);
				int end = Math.max(list.get(i).end, list.get(currentPosition).end);
				Interval interval = new Interval(start, end);
				list.remove(currentPosition);
				list.add(currentPosition, interval);
			}
		}
		
		int size = list.size();
		for (int i = currentPosition + 1; i < size; i++) {
			list.remove(currentPosition + 1);
		}
	}

	public static void main(String[] args) {
		ArrayList<Interval> list = new ArrayList<Interval>();
		
		list.add(new Interval(3, 8));
		list.add(new Interval(2, 29));
		list.add(new Interval(5, 17));
		list.add(new Interval(22, 47));
		list.add(new Interval(32, 48));
		Collections.sort(list);
		
		new Test().merge(list);
		for(Interval inter : list) {
			System.out.println("[" + inter.start + ", " + inter.end + "]");
		}
	}
}

class Interval implements Comparable<Interval>{
	int start;
	int end;
	
	Interval(int start, int end) {
		this.start = start;
		this.end = end;
	}

	public int compareTo(Interval o) {
		if (start > ((Interval)o).start || 
				(start == ((Interval)o).start && end > ((Interval)o).end)) {
				return 1;
		} else if (start == ((Interval)o).start && end == ((Interval)o).end) {
				return 0;
		}
		return -1;
	}
}

转载请注明出处:http://blog.csdn.net/beiyeqingteng

相关文章推荐

间隔问题 [No. 56]

问题: 给定多个不重合的间隔(interval),比如 [3, 8] [ 12, 17] [22, 29], 然后插入一个新的间隔, 比如 [ 5, 15], 求最后不重合的间隔。比如,起初的不重合...

间隔问题3 [No. 58]

问题: 给一组间隔,找出一个点,使得穿过改点的间隔数量最大, 时间复杂度不能超过 O(N lg N)。比如有一组间隔为[1, 5] [ 3, 7] [2, 4] [8, 9], 那么对于点 3.5,...

Leetcode #57. Insert Interval 间隔插入 解题报告

1 解题思想首先,请先看昨天的基友题 Leetcode #56. Merge Intervals 间隔合并 解题报告今天的题目也是给了一堆区间,然后再给一个额外的区间,让你将他进行插入,然后合并输出。...
  • MebiuW
  • MebiuW
  • 2016年04月27日 23:56
  • 1061

使用Struts2遇到There is no action mapped for namespaces / and action name的问题

在最初配置struts中会遇到There is no Action mapped for namespace / and action name类似的问题,很多情况是我们粗心大意导致的,以下为总结的解...

struts2出现No result defined for action。。。。。问题的解决办法

今天调试struts2时,出现了一个问题。检查了好多遍确定没什么问题,可还是会报错: No result defined for action com.guang.struts2.token and...

新建python环境无法导入libxml2dom的问题:ImportError: No module named libxmlmods

http://pan.baidu.com/s/1qWBdlbY

No.2:完全背包问题

题目 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路 ...
  • Niteip
  • Niteip
  • 2014年02月12日 20:54
  • 1030

Python练手爬虫系列No.2 抓取知乎问题下所有回答中的图片(待续)

接着上一篇Python练手爬虫系列No.1 知乎福利收藏夹图片批量下载,今天我们来按照知乎问题抓图片!比起收藏夹,更加直接精准。为什么先抓收藏夹后抓取问题呢,其实是因为知乎的一点限制。 那就是!知乎...
  • hacklyc
  • hacklyc
  • 2017年03月29日 00:07
  • 278

Fedora 16 用Live CD 修复grub2,附“No root device”问题解决

很好,终于有问题出来。 前几天,想破解邻居的无线网络密码,在网上找了教程,找了教程就算了,还得写入硬盘映像到U盘,这也就算了,还要重写MBR。问题来了······重写MBR时,没有选中U盘,按了确定...

黑马程序员------多线程(No.2)(死锁、线程间通信、生产者消费者问题)

死锁   死锁(开发过程中要避免死锁) 同步中嵌套同步。   为了透彻了解死锁,下面写一个死锁程序: class Test implements Runnable{ private boolean ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:间隔问题2 [No. 57]
举报原因:
原因补充:

(最多只允许输入30个字)