2015.04.01 Leetcode Insert interval


Insert Interval解法:
先用start,end两个变量来定位 newinterval可能要插入的起始点和结束点。 分三种情况来看是否需要调整或合并(merge)。
case1: 在start 之前直接copy 到结果res; case2: 在end之后也是直接copy到res中; case3: 需要合并的就是newInterval.start, newInterval.end, 和任选的一个interval 的interval.start , interval.end 四个边界的比较。 下面是源代码 和我的github链接 https://github.com/hustbill/java-OJ/blob/master/InsertInterval.java


 
<pre name="code" class="java">/*

https://leetcode.com/problems/insert-interval/

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].


*/


/**
 * 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;
import java.util.*;

public class InsertInterval {
 
    /**
     * In place solution
     * Find start and end point of the interval to be merged
     */
	    public static List<Interval> insert(List<Interval> intervals, Interval newInterval) {
			List<Interval> res = new ArrayList<Interval>();
	        if (intervals == null||intervals.size() == 0){
	            res.add(newInterval);
	            return res;
	        }
			int start=0, end = 0;  
			// find the insert position for newInterval , to be insert or merged
			for( Interval interval : intervals) {
				if(newInterval.start > interval.end) start++;
				if(newInterval.end >= interval.start)  end++;
			    else break;
			}
			
			if(start== end) {  // no need merge, just copy all intervals into res
				res.addAll(intervals);
				res.add(start, newInterval) ;    // insert the new one
				return res;
			}
			for(int i=0; i< start; i++)  res.add(intervals.get(i));
			// intervl and newInterval are a closer range
			Interval interval = new Interval( Math.min( intervals.get(start).start, newInterval.start),
												Math.max( intervals.get(end-1).end,  newInterval.end));  // note that, it's end-1
			res.add(interval);
			for(int j=end; j< intervals.size(); j++) {
				res.add(intervals.get(j));   // after the newInterval insert, copy the remains into res
			}
			return res;
		}
	
	
	public static void testCase1() {
		// Case 1:
		System.out.println("Case 1");
		Interval interval0 = new Interval(1,2);
		// Interval interval0 = new Interval(0,1);
		Interval interval1 = new Interval(3,5);
		Interval interval2 = new Interval(6, 7);
		Interval interval3 = new Interval(8, 10);
		Interval interval4 = new Interval(12, 16);
		List<Interval> intervals = new ArrayList<Interval>();
		intervals.add(interval0);
		intervals.add(interval1);
		intervals.add(interval2);
		intervals.add(interval3);
		intervals.add(interval4);
		printIntervals(intervals);	
		Interval newInterval_1 = new Interval(4,9);
		// Interval newInterval_1 = new Interval(4,11);
		System.out.println("\nstart Insert newInterval_1 : " + newInterval_1.start + " , " + newInterval_1.end);
		intervals = insert(intervals, newInterval_1);
		printIntervals(intervals);		
	}
	
	public static void testCase2() {
		// Case 2
		System.out.println("\n\nCase 2");
		Interval interval5 = new Interval(0, 1);
		Interval interval6 = new Interval(4, 9);
		List<Interval> intervals2 = new ArrayList<Interval>();
		intervals2.add(interval5);
		intervals2.add(interval6);
		printIntervals(intervals2);
		Interval newInterval_2 = new Interval(2,5); 

		System.out.println("start Insert newInterval2 : " + newInterval_2.start + " , " + newInterval_2.end);
		intervals2 = insert(intervals2, newInterval_2);
		printIntervals(intervals2);
	}
	
	public static void testCase3() {
		// Case 3
		System.out.println("\n\nCase 3");
		Interval interval5 = new Interval(1, 5);
		List<Interval> intervals2 = new ArrayList<Interval>();
		intervals2.add(interval5);
		printIntervals(intervals2);
		Interval newInterval_2 = new Interval(2,3); 

		System.out.println("start Insert newInterval2 : " + newInterval_2.start + " , " + newInterval_2.end);
		intervals2 = insert(intervals2, newInterval_2);
		//printIntervals(intervals2);
	}
	
	public static void main(String[] args){
		testCase1();
		 testCase2();
		 testCase3();
	}
	
	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);
		}
	}
	
}



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值