这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战
leetcode 插入区间
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 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] 重叠。
示例 3:
输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]
解题:intervals 数组内有若干的区间,每个区间用两个元素的数组 [starti, endi] 表示,并且starti<=endi,并且每个元素区间都是无重叠的,intervals 数组也是按元素区间开始位置升序的。然后需要将newInterval区间,插入到intervals 数组中,使得数组中的元素区间还是无重叠且升序的。那么将newInterval区间按排列顺序添加到数组对应的位置就满足有序条件了,但是newInterval区间有可能与intervals 数组内的某些区间有重叠的,那就需要将这些有重叠部分的区间合并成一个大区间即可。具体的要判断是否重叠是用一个区间的开始位置和另外一个区间的结束位置比较,如果这个开始位置是大于这个结束位置的,那这两个区间并不是重叠的。但是开始位置、结束位置应该是哪个区间的呢?因为开始位置是肯定小于等于结束位置的,所以对于开始位置较大的区间我们取其开始位置、对于开始位置较小的区间我们取其结束位置来比较。基于intervals 数组元素有序的情况,如果有需要合并的区间,那这些区间肯定也都是连续相邻的了。然后遍历intervals 数组元素区间,比较当前遍历元素区间的结束位置和newInterval区间的开始位置,如果这个开始位置大于结束位置说明没有重叠的,否则就需要将两个区间合并在添加到结果集。如果一直没有重叠,那么newInterval区间合并不到intervals 数组就需要按顺序插入,当遍历遇到当前元素的开始位置>newInterval区间的结束位置,说明之后的区间开始位置肯定会大于newInterval区间的开始位置,所以可以将newInterval添加到结果集。
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> resList = new ArrayList<int[]>();
int i = 0;
while (i < intervals.length && intervals[i][1] < newInterval[0]) {
resList.add(intervals[i++]);
}
while (i < intervals.length && intervals[i][0] <= newInterval[1]) {
newInterval[0] = Math.min(intervals[i][0], newInterval[0]);
newInterval[1] = Math.max(intervals[i][1], newInterval[1]);
i++;
}
resList.add(newInterval);
while (i < intervals.length) {
resList.add(intervals[i++]);
}
return resList.toArray(new int[resList.size()][]);
}
}