LintCode 30.插入区间

 

描述:

给出一个无重叠的按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

 

样例:

样例 1:

输入:
(2, 5) into [(1,2), (5,9)]
输出:
[(1,9)]

样例 2:

输入:
(3, 4) into [(1,2), (5,9)]
输出:
[(1,2), (3,4), (5,9)]

代码:

public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        // write your code here
        List<Interval> res=new LinkedList<>();
        int cur=0;//保存插入的位置
        for(int i=0;i<intervals.size();i++){//size():是针对泛型集合来说的,如果想要知道这个泛型集合中有多少元素,即可使用size()这个方法。
            Interval interval=intervals.get(i);
            if(newInterval.end<interval.start){
                res.add(interval);
            }else if(newInterval.start>interval.end){
                res.add(interval);
                cur++;
            }else{//有重叠区域的情况
                newInterval.start=Math.min(interval.start,newInterval.start);
                newInterval.end=Math.max(interval.end,newInterval.end);
            }
        }
        //在cur保存插入的位置
        res.add(cur,newInterval);
        return res;
    }

补充说明:

在非重叠的区间中插入一个新的区间,可能还需要与原有的区间进行合并,因此要对给定的区间集合进行遍历,需要考虑两点:1.新插入的区间与原有区间不重叠,不重叠的情况分为两种:第一种是新区间的start>原区间的end;第二种是新区间的end<原区间的start。这种情况直接将新区间插入到对应的位置即可。

2.新插入的区间与原有区间重叠,可能存在多个重叠,所以需要更新区间的范围来包含所有重叠。

用变量cur来遍历区间,如果当前cur区间的结束位置小于新加入区间的开始位置,则说明没有重叠且新区间在当前cur区间后面,则将cur区间加入到res中,cur+1;如果当前cur区间的开始位置大于新加入区间的结束位置,则说明没有重叠且新区间在当前cur区间之前;除此之外的情况,都是有重叠的情况,此时更新新加入区间的开始位置和结束位置,更新后的开始位置为新区间开始位置和当前区间开始位置的较小的,更新后的结束位置为新区间结束位置和当前区间结束位置的较大的。

最后返回的cur为新区间插入的位置,在该位置插入新区间后返回即可。

 

注:程序及思路参照了博主HxxxxxxxU,还可以进一步降低程序的快速性,后续再添加
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值