Monday, June 23, 2014

Leetcode - Insert Interval

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].
[Thoughts]: 
public class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        List<Interval> res = new ArrayList<Interval>();
        if(newInterval==null) 
            return intervals;
        
        Interval pre = newInterval;
        int index = 0;
        Interval cur;
        while(index < intervals.size()){
            cur = intervals.get(index);
            if(pre.end < cur.start){
                res.add(pre);
                pre = cur;
            }else if(pre.start > cur.end)
                res.add(cur);
            else{//当有重叠时,new一个新的interval对象
                pre = new Interval(Math.min(pre.start, cur.start), Math.max(pre.end, cur.end));
            }
            index++;
        }
        res.add(pre);//不要忘了加pre
        return res;
    }
}
后来看到这个解法,觉得很棒。利用iterator,不用额外的空间。
public class Solution {//10:04
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        ListIterator<Interval> iterator = intervals.listIterator();
        while(iterator.hasNext()){
            Interval cur = iterator.next();
            if(newInterval.end < cur.start){
                iterator.previous();
                iterator.add(newInterval);
                return intervals;
            }else if(newInterval.start > cur.end)
                continue;
            else{
                newInterval.start = Math.min(newInterval.start, cur.start);
                newInterval.end = Math.max(newInterval.end, cur.end);
                iterator.remove();
            }
        }
        intervals.add(newInterval);
        return intervals;
    }
}

No comments:

Post a Comment