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);
}
}
}