给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 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] 重叠。来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/insert-interval
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
虽然标的是困难题但是思路并不复杂。用binarySearch在数组中查找两个位置。
位置1和位置1的左边满足
区间右端点小于新区间的左端点
位置2和位置2的右边满足
区间左端点大于新区间的右端点。
这样两个位置分别的左右一定出现在结果中
最后再把需要合并的区间加上就好了,不管是什么情况都只需要加一个区间就好:
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
//为什么我又想说就这 二分查找左右区间
//查找左端点 满足左边的右端点均小于新区间的左端点
//寻找右端点 满足右边的左端点均大于新区间的右端点
int n = intervals.length;
int[] inverseNew = new int[] {newInterval[1], newInterval[0]};
int index1 = Arrays.binarySearch(intervals, inverseNew, (a, b)->a[0] - b[0]);
int index2 = Arrays.binarySearch(intervals, inverseNew, (a, b)->a[1] - b[1]);
//如果两个index大于0说明有恰好连接的 恰好连接的合并 没连接的保留 index标记合并的算了
if(index1 < 0) {
index1 = - index1 - 1;//都是不合并的第一个
} else {
++index1;
}
if(index2 < 0) {
index2 = - index2 - 2;
} else {
--index2;
}
int[][] ret = new int[n - index1 + 1 + index2 + 1][];
for(int i = 0; i <= index2; ++i) {
ret[i] = intervals[i];
}
for(int i = n - 1; i >= index1; --i) {
ret[ret.length - (n - i)] = intervals[i];
}
ret[index2 + 1] = newInterval;
if(index1 - index2 > 1) {
newInterval[0] = Math.min(newInterval[0], intervals[index2 + 1][0]);
newInterval[1] = Math.max(newInterval[1], intervals[index1 - 1][1]);
}
return ret;
}
}