Merge Intervals

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] would result in [1,5],[6,9].

Example 2:

Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] would result in [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

Make sure the returned intervals are also sorted.

思路:

首先用binary search找到不与新interval overlap的插入点,然后从插入点插入新interval,分三种情况:

Solution:

Time: O(n)
Space: O(n)

/**
* Definition for an interval.
* public class Interval {
*     int start;
*     int end;
*     Interval() { start = 0; end = 0; }
*     Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
    public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
        ArrayList<Interval> result = new ArrayList<>();
           
        int left = 0;
        int right = intervals.size() - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (newInterval.start <= intervals.get(mid).end) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        int p = left;
        
        result.addAll(intervals.subList(0, p));
        for (int i = p; i < intervals.size(); i++) {
            Interval curr = intervals.get(i);
            if (newInterval.end < curr.start) {
                result.add(newInterval);
                newInterval = curr;
            } else if (curr.end < newInterval.start) {
                result.add(curr);
            } else {
                newInterval = new Interval(Math.min(curr.start, newInterval.start), Math.max(curr.end, newInterval.end));
            }
        }
        result.add(newInterval);
        return result;
    }
}