Insert Interval (Java)

来源:互联网 发布:练字软件app 编辑:程序博客网 时间:2024/06/06 05:33

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].

新区间和老区间的关系无非有三种:

1.新区间的start大于老区间的end,即新区间在老区间之后,两者无交集。这种情况将老区间加入结果集。

2.新区间的end小于老区间的start,即新区间在老区间之前,两者无交集。这种情况将老区间加入结果集(此种情况一定是发生在merge之后的,所以加入老区间之前一定要把merge的结果先加入)。

3.merge情况,新区间的start小于等于老区间的end,即两者有交集。这种情况,就merge二者,取二者的并集作为新区间(这个新区间大于等于原始的新区间,但不会对以后的新老区间合并产生错误,因为题设已经假设了给的区间之前无交集)。如果测试数据中有多个区间和原始新区间有交集的话,这条的执行结果会使这个新区间不断的增大,直至将所有的有交集的都合并(如果测试用例中是[1,5],[2,3]这种情况,老区间包含新区间,也会将[1,5]和[2,3]合并并且将合并结果[1,5]作为新区间返回)。

Source

    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {        if(intervals.size() < 1){  //intervals为空时,返回带newInterval的list        intervals.add(newInterval);        return intervals;        }                List<Interval> a = new ArrayList<Interval>();                for(int i = 0; i < intervals.size(); i++){        Interval cur = intervals.get(i);        if(cur.end < newInterval.start){  //cur在newInterval之前且无交集        a.add(cur);        }        else if(newInterval.end < cur.start){  //cur在newInterval之后且无交集        a.add(newInterval);        newInterval = cur;         //这里将cur赋值给newInterval是为了可以在for循环外执行a.add(newInterval);        //假如是Intervals为[[1,5]],newInterval为[2,3]这种情况,根本不会执行到这条if,那么newInterval就无法正常输出,为了统一管理,将最后一条在for以外输出                }        else if(newInterval.start <= cur.end){  //cur与newInterval有交集的情况        Interval merge = new Interval(Math.min(newInterval.start, cur.start), Math.max(newInterval.end, cur.end));        newInterval = merge;  //仅更新newInterval 不加入结果集 直至cur与newInterval再无交集时再加 这样可以避免加入中间结果而非最终的结果                }        }        a.add(newInterval);        return a;    } 


Test

    public static void main(String[] args){    Interval a = new Interval(1, 5);    List<Interval> list = new ArrayList<Interval>();    list.add(a);    //a = new Interval(3, 5);    //list.add(a);    //a = new Interval(6, 7);    //list.add(a);    //a = new Interval(8, 10);    //list.add(a);    //a = new Interval(12, 16);    //list.add(a);        Interval newInterval = new Interval(2, 3);    list = new Solution().insert(list, newInterval);    for(int i = 0; i < list.size(); i++){    System.out.println(list.get(i).start + " " + list.get(i).end);        }    }


0 0