LintCode 插入区间

来源:互联网 发布:个人时间规划软件 编辑:程序博客网 时间:2024/06/08 14:09

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

在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
样例
插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]。

插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]。

对于原区间列表中的任意一个,有以下三种情况:
1.新区间完全在原来某区间的左侧,那么就找到插入位置了,执行插入。
2.新区间完全在原来某区间的右侧,继续判断下一个原区间。
3.新区间与原来某区间有重叠,把新区间的start和end更新,记录下重叠区间,继续判断下一个原区间。
在最后执行插入的时候,把原来的重复区间都删掉,然后插入新区间。
代码如下:

/** * Definition of Interval: * public classs Interval { *     int start, end; *     Interval(int start, int end) { *         this.start = start; *         this.end = end; *     } */public class Solution {    /*     * @param intervals: Sorted interval list.     * @param newInterval: new interval.     * @return: A new interval list.     */    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {        // write your code here        int l=0,r=0;//l用来记录第一个重复区间的位置。        if(intervals.size()==0){//原区间列表是空,直接插入。            intervals.add(newInterval);            return intervals;        }        for(int i=0;i<intervals.size();i++){            if(intervals.get(i).end<newInterval.start){l++;}//新区间在这个原区间右侧,l++,未重叠,所以l后移一位            else if(intervals.get(i).start>newInterval.end){//新区间在这个原区间左侧,可以执行插入了                break;            }            else{                newInterval.start=Math.min(newInterval.start,intervals.get(i).start);                newInterval.end=Math.max(newInterval.end,intervals.get(i).end);                r++;//记录重叠区间的个数            }        }        for(int j=l+r-1;j>=l;j--){//删除重叠区间,注意从后向前删除,否则列表的长度在删除时减小,而下标在增大,会越界            intervals.remove(j);         }        intervals.add(l,newInterval);        return intervals;    }}
原创粉丝点击