2015.03.30 LeetCode Merge Intervals 解题记录

今天下午做了一道题。leetcode merge intervals 属于比较难的题目。 

首先用collections.sort 给list排序,然后用两个while loop来比较两个interval 的start, end 。 从而生成新的interal,再插入到新的list 返回结果。 

下面给出自己的代码:


/*
 50 Merge Intervals 
 
 https://leetcode.com/problems/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; }
 * }
 */

import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import java.util.Comparator;

public class MergeIntervals {
	//  sort the List, and then compare two Interval in two while loops
	 public static List<Interval> merge(List<Interval> intervals) {
		 // Ref : http://gongxuns.blogspot.com/2012/12/leetcode-merge-intervals.html
		 List<Interval> res = new ArrayList<Interval>();
 		Collections.sort(intervals, new Comparator<Interval>(){
 		            public int compare(Interval p1, Interval p2) {
 		                 if (p1.start != p2.start ) 
							 	return (p1.start- p2.start );
						 else 
							 return (p1.end - p2.end);
						}
 		        });
		printIntervals(intervals);
		int i=0;
		while(  i< intervals.size()) {
			int j= i+1;
			Interval left = intervals.get(i);
			int end = left.end;
			while (j< intervals.size()  && end >= intervals.get(j).start) {	
				end = Math.max(end, intervals.get(j).end);
				j++;
			}
			res.add( new Interval(left.start, end));
			i=j;
		}
		// System.out.println("final");
		// printIntervals(res);
		return res;
			
	 }
	 
	 
	public static void main(String[] args) {
		Interval interval0 = new Interval(0,2);
		Interval interval1 = new Interval(4, 6);
		
		Interval interval2 = new Interval(1, 1);
		Interval interval3 = new Interval(5, 5);
		Interval interval4 = new Interval(3, 3);
		Interval interval5 = new Interval(5, 6);
		Interval interval6 = new Interval(0, 1);
		Interval interval7 = new Interval(0, 1);
		Interval interval8 = new Interval(1, 2);
		Interval interval9 = new Interval(5, 6);	
		Interval interval10 = new Interval(5, 5);	
		Interval interval11 = new Interval(0, 0);		
		
		//[[0,2],[4,6],[1,1],[5,5],[3,3],[5,6],[0,1],[0,1],[1,2],[5,6],[5,5],[0,0]]
		List<Interval> intervals = new ArrayList<Interval>();
		intervals.add(interval0);
		intervals.add(interval1);
		intervals.add(interval2);
		intervals.add(interval3);
		intervals.add(interval4);
		intervals.add(interval5);
		intervals.add(interval6);
		intervals.add(interval7);
		intervals.add(interval8);
		intervals.add(interval9);
		intervals.add(interval10);
		intervals.add(interval11);
		//System.out.println(intervals);
		//Collections.sort(intervals);
		intervals = merge(intervals);
			System.out.println("start merge : ");
		printIntervals(intervals);
		
	}
	
	public static void printIntervals(List<Interval> intervals) {
		//System.out.println(intervals);
		for (int i = 0; i < intervals.size(); i++) {
           System.out.println("Index: " + i + " - Item: " 
			   + intervals.get(i).start + " "+ intervals.get(i).end);
		}
	}
	
	
}

/**
 * Definition for an interval. */
  class Interval {
     int start;
      int end;
      Interval() { start = 0; end = 0; }
      Interval(int s, int e) { start = s; end = e; }
	   
  }
  



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值