专栏首页用户画像Leetcode No.57 插入区间

Leetcode No.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

二、解题思路

本题中的区间已经按照起始端点升序排列,因此我们直接遍历区间列表,寻找新区间的插入位置即可。具体步骤如下:

首先将新区间左边且相离的区间加入结果集(遍历时,如果当前区间的结束位置小于新区间的开始位置,说明当前区间在新区间的左边且相离);

接着判断当前区间是否与新区间重叠,重叠的话就进行合并,直到遍历到当前区间在新区间的右边且相离,将最终合并后的新区间加入结果集;

最后将新区间右边且相离的区间加入结果集。

三、代码

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        int[][] res = new int[intervals.length + 1][2];
        int idx = 0;
        // 遍历区间列表:
        // 首先将新区间左边且相离的区间加入结果集
        int i = 0;
        while (i < intervals.length && intervals[i][1] < newInterval[0]) {
            res[idx++] = intervals[i++];
        }
        // 接着判断当前区间是否与新区间重叠,重叠的话就进行合并,直到遍历到当前区间在新区间的右边且相离,
        // 将最终合并后的新区间加入结果集
        while (i < intervals.length && intervals[i][0] <= newInterval[1]) {
            newInterval[0] = Math.min(intervals[i][0], newInterval[0]);
            newInterval[1] = Math.max(intervals[i][1], newInterval[1]);
            i++;
        }
        res[idx++] = newInterval;
        // 最后将新区间右边且相离的区间加入结果集
        while (i < intervals.length) {
            res[idx++] = intervals[i++];
        }

        return Arrays.copyOf(res, idx);
    }
}

四、复杂度分析

时间复杂度:O(n),其中 n 是数组 intervals 的长度,即给定的区间个数。

空间复杂度:O(n),除了存储返回答案的空间以外,我们只需要额外的常数空间即可。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Leetcode】57. 插入区间

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

    Leetcode名企之路
  • LeetCode 57. 插入区间

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

    韩旭051
  • ​LeetCode刷题实战57:插入区间

    https://leetcode-cn.com/problems/insert-interval/

    程序IT圈
  • LeetCode 57. 插入区间(一次遍历)

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

    Michael阿明
  • Leetcode No.56 合并区间

    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一...

    week
  • 插入区间

    一份执着✘
  • LeetCode40-60题汇总,速度收藏!

    今天把最近发布的40-60篇LeetCode文章整理一下,平时文章都放在比较末尾,阅读量都不高,相信很多人都没看过,如果对于算法感兴趣的,建议可以每篇认真阅读一...

    程序IT圈
  • LeetCode50-80题汇总,速度收藏!

    今天把最近发布的50-80篇LeetCode文章整理一下,平时文章都放在比较末尾,阅读量都不高,相信很多人都没看过,如果对于算法感兴趣的,建议可以每篇认真阅读一...

    程序IT圈
  • LeetCode134|插入区间

    给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

    码农王同学
  • 9月技术文章汇总

    Leetcode名企之路
  • ​LeetCode刷题实战58:最后一个单词的长度

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就...

    程序IT圈
  • 【python-leetcode57-区间合并】插入区间

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

    西西嘛呦
  • [Leetcode][python]Insert Interval/插入区间

    来自:https://shenjie1993.gitbooks.io/leetcode-python/057%20Insert%20Interval.html ...

    蛮三刀酱
  • LintCode-30. 插入区间

    给出一个无重叠的按照区间起始端点排序的区间列表。 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

    悠扬前奏
  • LeetCode 3题合集,砍瓜切菜刷三题不费劲

    今天是LeetCode专题的第34篇文章,刚好接下来的题目比较简单,很多和之前的做法类似。所以我们今天出一个合集,一口气做完接下来的57、59和60这三题。

    TechFlow-承志
  • LeetCode1-100题汇总,希望对你有点帮助!

    时间很快,公众号发布的LeetCode题目,已经达到100道题了。今天把发布的1-100篇LeetCode文章整理一下,平时文章都放在比较末尾,阅读量都不高,相...

    程序IT圈
  • 秒懂力扣区间题目:重叠区间、合并区间、插入区间

    今天的力扣打卡题是 57. 插入区间 ,我们再顺便练习两道类似的简单区间题目,比如:判断区间是否重叠(252. 会议室)、56. 合并区间。这类面试题目还挺讨巧...

    灵魂画师牧码
  • LeetCode1-120题汇总,希望对你有点帮助!

    时间很快,公众号发布的LeetCode题目,已经达到120道题了。今天把发布的1-120篇LeetCode文章整理一下,平时文章都放在比较末尾,阅读量都不高,相...

    程序IT圈
  • 【leetcode刷题】T7-Search Insert Position(搜索插入位置)

    今天分享leetcode第7篇文章,也是leetcode第35题—Search Insert Position,地址是:https://leetcode.com...

    木又AI帮

扫码关注云+社区

领取腾讯云代金券