LeetCode 57—— 插入区间

阅读目录

    • [1. 题目](#1. 题目)
    • [2. 解题思路](#2. 解题思路)
    • [3. 代码实现](#3. 代码实现)

1. 题目

2. 解题思路

第一步,我们先寻找新区间和原始区间列表的重叠部分。

假设新区间为 x 1 , x 2 x_1, x_2 x1,x2,原始区间列表中的其中一个区间为 y 1 , y 2 y_1, y_2 y1,y2,那么如果两个区间不存在重叠的话,如上图所示,当且仅当:

x 2 < y 1 ∣ ∣ y 2 < x 1 x_2 < y_1 \space || \space y_2 < x_1 x2<y1 ∣∣ y2<x1

其它情况下,两个区间都会存在重叠,而重叠后的新区间有:

x 1 n e w = m i n ( x 1 , y 1 ) x^{new}_1 = min(x_1, y_1) x1new=min(x1,y1)
x 2 n e w = m a x ( x 2 , y 2 ) x^{new}_2 = max(x_2, y_2) x2new=max(x2,y2)

因此,我们首先遍历一遍原始区间列表,如果某个区间和新区间不重叠,我们直接添加这个区间到结果区间列表中去,如果某个区间和新区间存在重叠,那么我们更新重叠区间

然后,我们遍历结果区间列表,将重叠区间插入到合适的位置即可。

时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( n ) O(n) O(n)。

3. 代码实现

c 复制代码
class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int> > new_intervals;
        for (size_t i = 0; i < intervals.size(); ++i) {
            // 和新区间不重叠,直接插入到结果中去
            if (newInterval[1] < intervals[i][0] || intervals[i][1] < newInterval[0]) {
                new_intervals.push_back(intervals[i]);
            } 
            // 和新区间有重叠,更新重叠区间
            else {
                newInterval[0] = min(intervals[i][0], newInterval[0]);
                newInterval[1] = max(intervals[i][1], newInterval[1]);
            }
        }
        
        if (new_intervals.empty()) {
            new_intervals.push_back(newInterval);
        } else {
            // 寻找新区间的插入位置
            for (size_t i = 0; i < new_intervals.size(); ++i) {
            	// 比某个区间的起始位置小,插入到这个区间前面
                if (newInterval[1] < new_intervals[i][0]) {
                    new_intervals.insert(new_intervals.begin()+i, newInterval);
                    break;
                } // 插入到最后面
                else if (i == new_intervals.size()-1 && newInterval[0] > new_intervals[i][1]) {
                    new_intervals.push_back(newInterval);
                }
            }
        }
        return new_intervals;
    }
};
相关推荐
水上冰石2 分钟前
【MuJoCo从入门到精通】第2章 第一个 MuJoCo 仿真
前端·人工智能·算法
wenyq74 分钟前
LeetCode 2904. Shortest and Lexicographically Smallest Beautiful String
算法·leetcode
维克兜率天16 分钟前
【维克】技术指标是什么:从均线到MACD的数学原理
人工智能·笔记·python·算法·量化
Messy create20 分钟前
【储能系统三大核心】
网络·stm32·单片机·算法·能源
sel_927 分钟前
【vLLM】vLLM 推理框架详解:从 PagedAttention 到生产级部署实战
人工智能·深度学习·算法·语言模型·框架·vllm
XR1234567881 小时前
办公大楼组网选型决策树:TCO 与三大品牌优劣对比总结
算法·决策树·机器学习
阳明山水1 小时前
Mamba路径如何建模长程时序依赖
人工智能·深度学习·算法·机器学习·架构
_Narcissus_2 小时前
分治&递归
数据结构·c++·笔记·算法·leetcode·递归·分治
明志数科2 小时前
具身智能数据工程全链路解析:从真实产线采集到LeRobot适配
网络·人工智能·算法
小O的算法实验室3 小时前
AAAI-26,Lehmer编码搜索排列空间的理论与实证分析
算法