Insert Interval
Given a set of non-overlapping intervlas, insert a new interval into intervals(merge if necessary)
给一个组特殊的数据结构interval
和一个目标interval
, 每个interval
有start
和end
. 输入的一组interval
没有重合, 要求把新的interval
插入到原来的那一组interval
当中, 如果有需要合并的话, 对interval
进行合并
例如:
输入是 [[1, 3], [6, 9]]
和 [2, 5]
, 那么我们需要返回[[1, 5], [6, 9]]
思路
首先可以明确的是, 要插入一个新的interval
, 有下面五种可能
- 跟原来的没有任何重叠, 不需要合并
start
落在其中一个interval
当中, 但是end
不在任何interval
当中, 需要改变原来interval
的end
值[[1, 3], [6, 9]]
和[2, 5]
. 这里需要把[1, 3]
扩大成[1, 5]
end
落在其中一个interval
当中, 但是start
不再任何interval
当中, 需要改变原来interval
的start
值[[2, 5], [6, 9]]
和[1, 4]
. 这里需要把[2, 5]
扩大成[1, 5]
start
落在其中一个interval
当中,end
落在另外一个interval
当中, 需要把多个interval
进行合并.[[1, 3], [6, 9]]
和[2, 7]
. 这里需要把[1, 3]
,[6, 9]
合并, 变成[1, 6]
start
和end
都落在同一个interval
当中, 那么什么也不用改.
清楚了上面的规则之后, 我们可以把工作简化成合并interval
. 因为作为输入的一组interval
是经过排序的, 把newInterval
插入后也按照interval
的start
值进行排序. 比如说, [[1, 3], [6, 9]]
, 插入[2, 4]
之后, 变成[[1, 3], [2, 4], [6, 9]]
. 然后我们对这一组interval
按照上面说的规则进行合并, 就是我们最终的答案.
Code
1 | def merge(interval): |
复杂度
因为要进行排序, 所以bets case: $O(n)$, average case: $O(nlogn)$, worst case: $O(nlogn)$.
EOF