57.插入区间

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

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

返回插入之后的 intervals

注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。

示例 1:

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

示例 2:

1
2
3
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [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
39
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
int left = newInterval[0]; // 新区间的左边界
int right = newInterval[1]; // 新区间的右边界
boolean placed = false; // 标记新区间是否已被插入列表
List<int[]> ansList = new ArrayList<>(); // 结果列表,用于存储合并后的区间

for (int[] interval : intervals) {
if (interval[0] > right) {
// 如果当前区间在新区间的右侧且无交集
if (!placed) {
// 如果新区间还没有被添加到结果列表,添加新区间
ansList.add(new int[]{left, right});
placed = true; // 标记为已添加
}
// 将当前区间添加到结果列表
ansList.add(interval);
} else if (interval[1] < left) {
// 如果当前区间在新区间的左侧且无交集
ansList.add(interval); // 直接添加当前区间到结果列表
} else {
// 如果当前区间与新区间有交集,合并区间
left = Math.min(left, interval[0]); // 更新合并后区间的左边界为最小值
right = Math.max(right, interval[1]); // 更新合并后区间的右边界为最大值
}
}
if (!placed) {
// 如果遍历结束后新区间还没有被添加,添加新区间
ansList.add(new int[]{left, right});
}
// 将结果列表转换成数组形式以符合返回类型要求
int[][] ans = new int[ansList.size()][2];
for (int i = 0; i < ansList.size(); i++) {
ans[i] = ansList.get(i);
}
return ans;
}
}