【刷题打卡】57. 插入区间

93 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、题目描述:

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] 重叠。

示例 3:

输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]

示例 4:

输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]

示例 5:

输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]

提示:

  • 0 <= intervals.length <= 10^4
  • intervals[i].length == 2
  • 0 <= intervals[i][0] <= intervals[i][1] <= 10^5
  • intervals 根据 intervals[i][0] 按 升序 排列
  • newInterval.length == 2
  • 0 <= newInterval[0] <= newInterval[1] <= 10^5

二、思路分析:

其实就按照正常思路做就可以了,先构造一个数组,里面存储各个区间,然后循环遍历,如果要插入的区间与原来的区间没有交集,直接将原来的区间add到数组中,如果有交集,则判断左端点与右端点与新插入区间的关系,左端点永远取最小值,右端点永远取最大值。最后在结果中add最小值与最大值即可。 最后再将结果重新转换为一个数组,并利用compare进行排序就可以了。

三、AC 代码:

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        int n = intervals.length;
        //if(n==0) return new int[newInterval][];
        List<int[]> inserted = new ArrayList<>();
        int L=newInterval[0],R=newInterval[1];
        for(int i=0;i<n;i++){
            if(intervals[i][1]<L ||intervals[i][0]>R){
                inserted.add(intervals[i]);
            }else{
                L=Math.min(intervals[i][0],L);
                R=Math.max(intervals[i][1],R);
            }
        }
        inserted.add(new int[]{L,R});
        int[][] result = inserted.toArray(new int[inserted.size()][2]);
        Arrays.sort(result,new Comparator<int[]>(){
            public int compare(int[] interval1,int[] interval2){
                return interval1[0]-interval2[0];
            }
        });
        return result;
    }
}

范文参考:

思路不清晰,代码不简单【GO】【二分法】 - 插入区间 - 力扣(LeetCode) (leetcode-cn.com)