现在的位置: 首页 > 综合 > 正文

[LeetCode]Insert Interval

2018年05月13日 ⁄ 综合 ⁄ 共 1512字 ⁄ 字号 评论关闭

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).

Example

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

抱歉!评论已关闭.