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