Given a non-overlapping interval list which is sorted by start point.
Insert a new interval into it, make sure the list is still in order and non-overlapping (merge intervals if necessary).
Insert [2, 5] into [[1,2], [5,9]], we get [[1,9]].
Insert [3, 4] into [[1,2], [5,9]], we get [[1,2], [3,4], [5,9]].
解题思路:
第一种思路是使用类似bitmap方式来存储数据,最后通过所有在bitmap中的字段来检查所有连续在一起的段值。解法发现不行,缺点是解决不了 start = end的情况,这样的情况,你是设置为true呢,还是不设置为true呢,如果通过设置为其他值的方式,思路就更加复杂了。
使用第二种方式来实现数据的插入(参考网上实现算法)。
迭代遍历每个对象,分别和待插入的段做比较,有如下6中情况。
情况1:待插入段比当前对象都大--> 插入当前对象,继续循环
情况2:待插入段比当前对象都小--> 插入比较段,插入当前对象,比较段设置为空
情况3-情况6: 这个试看段间有重合,直接将两个段做合并,作为新的比较段
另外还要注意:
a. 在迭代的时候,情况2 会将比较段设置为null,所有如果比较段为null,直接执行情况1
b. 在循环结束后,判定,如果比较段不为null,则最后插入比较段(之前都为插入)
/**
 * 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>();
        
        if(intervals==null || intervals.size()==0){
            result.add(newInterval);
            return result;
        }
        
        for(Interval v:intervals){
            if(newInterval == null)
                result.add(v);
            else {
                if(newInterval.end < v.start){
                    result.add(newInterval);
                    newInterval = null;
                    result.add(v);
                } 
                else if(newInterval.start > v.end)
                    result.add(v);
                else {
                    newInterval.start = Math.min(newInterval.start,v.start);
                    newInterval.end = Math.max(newInterval.end,v.end);
                }
            }
        }
        if(newInterval != null)
            result.add(newInterval);
        
        return result;
    }
}
原文地址:http://blog.csdn.net/wankunde/article/details/43488529