2020_11_4 每日一题 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] 重叠。

来源:力扣(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;

    }
}

你可能感兴趣的:(每日一题,leetcode)