57. Insert Interval

Leetcode Diary

Posted by Xudong on September 10, 2020

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:

Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]

Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
Output: [[1,2],[3,10],[12,16]]
Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].

Thoughts

  • straightforward solution
  • 因为数组是已经排好序的,所以可以从左往右扫描
  • (intv.end < newIntv.start || intv.start > newIntv.end),没有overlap
  • 其他情况都是有overlap的情况,需要和new interval merge。
    • newInterval[0] = Math.min(intervals[i][0],newInterval[0])
    • newInterval[1] = Math.max(intervals[i][1],newInterval[1])

Code(JAVA)

public int[][] insert(int[][] intervals, int[] newInterval) {
    List<int[]>res = new ArrayList();
    int i = 0;
    //add before new interval
    while(i < intervals.length) {
        if(intervals[i][1] >= newInterval[0])
            break;
        res.add(intervals[i]);
        i ++;
    }
    //merge all overlap interval
    while(i < intervals.length) {
        if(intervals[i][0] > newInterval[1])
            break;
        newInterval[0] = Math.min(intervals[i][0],newInterval[0]);
        newInterval[1] = Math.max(intervals[i][1],newInterval[1]);
        i ++;
    }
    res.add(newInterval);
    //add after new interval
    while(i < intervals.length) {
        res.add(intervals[i]);
        i ++;
    }
    return res.toArray(new int[res.size()][2]);
}