Insert Interval (Java)

35 篇文章 0 订阅
7 篇文章 0 订阅

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值