题目
给你一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
解题思路
跟56题类似吧,嫌麻烦的同学可以把新区间加入进来,然后排序跑一遍56题的代码。这个题直接模拟也能写,题目给的区间都不相交且按照左端点升序排列,那么新区间加入后可以把所有的区间分为不想交的区间和相交的区间。其中不相交的区间只需要满足 interval[1] < newInterval[0]
或 interval[0] > newInterval[1]
,剩下的就都是相交的区间,其相交后的左端点和右端点,只需要取左端点的最小值和右端点的最大值。
代码
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> ans = new ArrayList<>();
Boolean flag = true;
int minLeft = newInterval[0], maxRight = newInterval[1];
for (int[] interval : intervals) {
if (interval[1] < newInterval[0]) {
ans.add(interval);
} else if (interval[0] > newInterval[1]) {
if (flag) {
ans.add(new int[]{minLeft, maxRight});
flag = false;
}
ans.add(interval);
} else {
minLeft = Math.min(minLeft, interval[0]);
maxRight = Math.max(maxRight, interval[1]);
}
}
if (flag) {
ans.add(new int[]{minLeft, maxRight});
}
return ans.toArray(new int[ans.size()][]);
}
}