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