57.插入区间

插入区间

给你一个 无重叠的,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。

在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。

返回插入之后的 intervals。

示例 1:

输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]

示例 2:

输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]

提示:

  • 0 <= intervals.length <= $10^4$
  • intervals[i].length == 2
  • 0 <= starti <= endi <= $10^5$
  • intervals 根据 starti 按 升序 排列
  • newInterval.length == 2
  • 0 <= start <= end <= $10^5$

解析

分三个阶段处理:在新区间之前的、与新区间重叠的、在新区间之后的。

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
/**
* @param {number[][]} intervals
* @param {number[]} newInterval
* @return {number[][]}
*/
var insert = function (intervals, newInterval) {
const result = [];
let i = 0;

// 1. 添加所有在 newInterval 之前的区间
while (i < intervals.length && intervals[i][1] < newInterval[0]) {
result.push(intervals[i]);
i++;
}

// 2. 合并所有与 newInterval 重叠的区间
while (i < intervals.length && intervals[i][0] <= newInterval[1]) {
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
i++;
}
result.push(newInterval);

// 3. 添加所有在 newInterval 之后的区间
while (i < intervals.length) {
result.push(intervals[i]);
i++;
}

return result;
};

三阶段处理法思路清晰,时间复杂度 O(n)。


57.插入区间
https://leetcode.lz5z.com/57.insert-interval/
作者
tickli
发布于
2023年10月30日
许可协议