【Leetcode】57.插入区间

57.插入区间

题目

给出一个无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

 

示例 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]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

方法

本题和第56题类似。但注意本题所给的区间已经按起始端点升序排序。因此我们仍然遍历区间,按如下步骤构建结果集:

  • 先将完全在新区间左边的区间(右边界都小于新区间左边界的区间)加入结果集
  • 当遇到一个区间,这个区间的右边界大于等于新区间的左边界,并且这个区间的左边界小于等于新区间的右边界时,则说明需要将其合并,我们将合并后的区间作为新的要插入的区间,继续进入循环。
  • 当需要合并的区间都合并完全后,将要插入的区间插入
  • 最后将完全在新区间右边的区间(左边界都大于新区间右边界的区间)加入结果集

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public int[][] insert(int[][] intervals, int[] newInterval) {
if(intervals == null || intervals.length == 0)
return new int[][]{newInterval};
int[][] res = new int[intervals.length + 1][2];
int res_index = 0;
int num_index = 0;
while(num_index < intervals.length && intervals[num_index][1] < newInterval[0])
res[res_index++] = intervals[num_index++];
while(num_index < intervals.length && intervals[num_index][1] >= newInterval[0] && intervals[num_index][0] <= newInterval[1]){
newInterval[0] = Math.min(intervals[num_index][0], newInterval[0]);
newInterval[1] = Math.max(intervals[num_index][1], newInterval[1]);
num_index++;
}
res[res_index++] = newInterval;
while(num_index < intervals.length && intervals[num_index][0] > newInterval[1])
res[res_index++] = intervals[num_index++];
return Arrays.copyOf(res, res_index);
}