lintcode:插入区间

题目:

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

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

样例

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

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

解题:

参考合并区间思想,可以将插入区间插入到列表中,再按照合并区间的思想解题

class Solution {
    /**
     * Insert newInterval into intervals.
     * @param intervals: Sorted interval list.
     * @param newInterval: A new interval.
     * @return: A new sorted interval list.
     */
    public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
         ArrayList<Interval> result = new ArrayList<Interval>();
         if(intervals == null || intervals.size() <=0){
             result.add(newInterval);
             return result;
         }
         intervals.add(newInterval);
         Collections.sort(intervals,new IntervalComparator());
         Interval last = intervals.get(0);
         for(int i = 1;i<intervals.size();i++){
             Interval cur = intervals.get(i);
             if(last.end>= cur.start){
                 last.end = Math.max(last.end,cur.end);
             }else{
                 result.add(last);
                 last = cur;
             }
         }
         result.add(last);
         return result;
    }
    private class IntervalComparator implements Comparator<Interval>{
        public int compare(Interval a,Interval b){
            return a.start - b.start;
        }
    }
}

原始已经有序,新加入元素后重新排序,没有这个必要了。

/**
 * Definition of Interval:
 * public classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this.start = start;
 *         this.end = end;
 *     }
 */

class Solution {
    /**
     * Insert newInterval into intervals.
     * @param intervals: Sorted interval list.
     * @param newInterval: A new interval.
     * @return: A new sorted interval list.
     */

    public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
        ArrayList<Interval> result = new ArrayList<Interval>();
        // write your code here
        if(intervals==null ||intervals.size()<=0){
             result.add(newInterval);
            return result;
        }
        int insertPos = 0;
        for(int i=0;i<intervals.size();i++){
            Interval curt = intervals.get(i);
            if(curt.end<newInterval.start){// 不相交 cur 后插入新区间
                result.add(curt);
                insertPos++;
            } else if(curt.start>newInterval.end){// 不相交 cur 前插入新区间
                result.add(curt);
            }else{
                newInterval.start = Math.min(curt.start,newInterval.start);
                newInterval.end = Math.max(curt.end,newInterval.end);
            }
            
        }
        result.add(insertPos,newInterval);
        return result;
    }
}

参考:http://www.jiuzhang.com/solutions/insert-interval/

原文地址:https://www.cnblogs.com/bbbblog/p/4883586.html