题目描述:给你一个 无重叠的 ,按照区间起始端点排序的区间列表
intervals
,其中intervals[i] = [starti, endi]
表示第i
个区间的开始和结束,并且intervals
按照starti
升序排列。同样给定一个区间newInterval = [start, end]
表示另一个区间的开始和结束。在
intervals
中插入区间newInterval
,使得intervals
依然按照starti
升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。返回插入之后的
intervals
。注意 你不需要原地修改
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]] 解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。提示:
0 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^5
intervals
根据starti
按 升序 排列newInterval.length == 2
0 <= start <= end <= 10^5
代码思路:遍历原始的 intervals
列表,对于每个区间:
- 如果当前区间的结束端点
e
小于新区间的起始端点st
,说明当前区间在新区间之前,直接添加当前区间。 - 如果新区间
newInterval
的结束端点ed
小于当前区间的起始端点s
,说明当前区间在新区间之后,此时如果尚未插入新区间,就先插入新区间,然后再添加当前区间。 - 否则,说明当前区间与新区间有重叠,需要合并两个区间,更新新区间的起始端点
st
和结束端点ed
为两者的最小和最大值。
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> ans = new ArrayList<>();
int st = newInterval[0];
int ed = newInterval[1];
boolean insert = false;
for (int[] interval : intervals) {
int s = interval[0], e = interval[1];
// 需要被添加的区间在 newInterval 前 后 重叠的情况
if (e < st) {
ans.add(interval);
} else if (s > ed) {
if (!insert) {
ans.add(new int[] { st, ed });
insert = true;
}
ans.add(interval);
} else {
st = Math.min(st, s);
ed = Math.max(ed, e);
}
}
if (!insert) {
ans.add(new int[] { st, ed });
}
return ans.toArray(new int[ans.size()][]);
}
}