Problem
Difficulty : Hard
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:
1 | Input: intervals = [[1,3],[6,9]], newInterval = [2,5] |
Example 2:
1 | Input: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8] |
Analysis
这道题虽然是一道Hard
题,但是看上去还是属于比较简单的题目,将一个新的区间合并到原有的区间当中。
Approach 1
最基本的方法就是依次遍历整个区间数组,判断是否和新的区间有交集,没有就直接放入新的数组里面,如果有在具体处理。
其基本的步骤如下:
- 首先,找出所有在新的区间之前的区间,放入新的数组中
- 然后,在与新区间有交集的原区间中,找出其最小的
Start
以及最大的End
,然后构成一个新的区间加入到结果中 - 最后,将剩余的区间也放入结果中
我们来看一个例子
原区间:
[[1,2], [3,5], [6,7], [8,10], [12,16]]
新的区间:[4, 8]
我们可以将原区间分为三个部分
[1,2]
、[3,5],[6,7],[8,10]
和[12,16]
第一个和第三个部分和新的区间并没有交集,因此可以直接放入结果当中
然后第二个部分和新的区间融合,找出其最小的
Start
和最大的End
,构成新的区间[3,10]
最后结果就是
[1,2],[3,10],[12,16]
代码如下:
1 | func insert(intervals []Interval, newInterval Interval) []Interval { |
这个算法只需要遍历原区间数组一次,因此时间复杂度为O(n)
,空间复杂度为O(n)
Summary
这道题的的确比较简单,只需要明确合并区间的条件,根据边界判断一下就可以得到答案。