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); } } }
2015.04.01 Leetcode Insert interval
原文地址:http://blog.csdn.net/hustbill/article/details/44823865