Description

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:

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

Example 2:

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].

在给出的有序区间中插入新的区间,需要合并相邻的区间。

Solution

  • 先找出所有比新区间小的区间
  • 再找出所有比新区间大的区间
  • 在查找过程中将新区间与相邻区间合并
  • 最后返回[小区间]+[新区间]+[大区间]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
func insert(intervals []Interval, newInterval Interval) []Interval {
    length := len(intervals)
    if length == 0 {
        return []Interval{newInterval}
    }

    // 分割比 newInterval 小的区间
    lEnd := 0
    for lEnd < length && newInterval.Start > intervals[lEnd].End {
        lEnd++
    }

    // 边界判断
    if lEnd == length {
        return append(intervals, newInterval)
    }

    if intervals[lEnd].Start < newInterval.Start {
        // 将当前区间与 newInterval 合并
        newInterval.Start = intervals[lEnd].Start
    }

    // 分割比 newInterval 大的区间
    rStart := lEnd
    for rStart < length && newInterval.End >= intervals[rStart].Start {
        if intervals[rStart].End > newInterval.End {
            // 将当前区间与 newInterval 合并
            newInterval.End = intervals[rStart].End
        }
        rStart++
    }

    // append 时用 newInterval 建立新的 Slice 与 intervals[rStart:] 合并
    // 再与 intervals[:lEnd] 合并
    // 之前直接将 newInterval append 到 intervals[:lEnd] 后面,再与 intervals[rStart:] 合并
    // 会导致 intervals[rStart:] 的内存区域被覆盖
    return append(intervals[:lEnd], append([]Interval{newInterval}, intervals[rStart:]...)...)
}

Similar Problem