插入区间。给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
1 |
|
示例 2:
1 |
|
1 |
|
思路一
tmp
表示 newInterval
落入的区间,初始化为 newInterval
,然后遍历intervals
,分以下几种情况考虑:
情况一
1 |
|
此时 newInterval.start > intervals[i].start
,直接将 intervals[i]
放入 result
中;
情况二
1 |
|
此时 intervals[i].start <= newInterval.start <= intervals[i].end
,可以更新 tmp
的开始和结束的位置,tmp.start = intervals[i].start, tmp.end = max(intervals[i].end, tmp.end)
。
情况三
1 |
|
此时 intervals[i].start <= newInterval.end <= intervals[i].end
,可以更新 tmp
的结束和开始位置,tmp.end = intervals[end], tmp.start = min(intervals[i].start, tmp.start)
情况四
1 |
|
此时 intervals[i].start > tmp.end
,说明 tmp
更新完成,将 tmp
添加到 result
中,并且将剩下的 intervals[i:]
添加到 result
中。
需要注意的是 tmp
不更新的情况,循环结束后需要单独考虑。
时间复杂度 \(O(n)\)。
1 |
|
思路二
寻找需要插入的 interval
左边部分和后边部分,并不断更新需要插入的 interval
的开始和结束。时间复杂度 \(O(n)\)。
1 |
|