【LeetCode】57. 插入区间

SoftwareDevOps 斗灵
优质创作者: 编程框架技术领域
领域专家: 后端开发技术领域
2022-09-05 11:24:31

给你一个 无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

 

示例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]]

 

思路与算法

在给定的区间集合 X 互不重叠的前提下,当我们需要插入一个新的区间 S=[left,right] 时,我们只需要:

  • 找出所有与区间 S 重叠的区间集合 X′;
  • 将 X′ 中的所有区间连带上区间 S 合并成一个大区间
  • 最终的答案即为不与 X′ 重叠的区间以及合并后的大区间

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        int left = newInterval[0];
        int right = newInterval[1];
        boolean placed = false;
        List<int[]> ansList = new ArrayList<int[]>();
        for (int[] interval : intervals) {
            if (interval[0] > right) {
                // 在插入区间的右侧且无交集
                if (!placed) {
                    ansList.add(new int[]{left, right});
                    placed = true;                    
                }
                ansList.add(interval);
            } else if (interval[1] < left) {
                // 在插入区间的左侧且无交集
                ansList.add(interval);
            } else {
                // 与插入区间有交集,计算它们的并集
                left = Math.min(left, interval[0]);
                right = Math.max(right, interval[1]);
            }
        }
        if (!placed) {
            ansList.add(new int[]{left, right});
        }
        int[][] ans = new int[ansList.size()][2];
        for (int i = 0; i < ansList.size(); ++i) {
            ans[i] = ansList.get(i);
        }
        return ans;
    }
}

 

 

 

...全文
44 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

126

社区成员

发帖
与我相关
我的任务
社区描述
想刷题,往往三天打鱼两天晒网,没有毅力坚持下去的人。可以跟着此专栏,一天一道题,坚持就是胜利!
后端云原生前端框架 个人社区 江苏省·苏州市
社区管理员
  • SoftwareDevOps
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

“1024 程序员节|用代码,改变世界” 主题征文开启,限定勋章&丰富周边大奖等你拿!快来投稿吧~

https://bbs.csdn.net/topics/608723542

在本页面下,评论:我要报名。

 

即可参赛成功!1022~1024期间发文还能获取1024勋章!快来参与吧!第一次组织,希望各位大佬多多支持呐!

试试用AI创作助手写篇文章吧