【数据结构-扫描线】力扣57. 插入区间

给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervalsi = starti, endi 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = start, end 表示另一个区间的开始和结束。

在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。

返回插入之后的 intervals。

注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。

示例 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 重叠。

扫描线

cpp 复制代码
class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> answer;
        int left = newInterval[0], right = newInterval[1];
        bool placed = false;
        for(auto interval : intervals){
            //区间在插入区间右侧
            if(interval[0] > right){
                if(!placed){
                    answer.push_back({left, right});
                    placed = true;
                }
                answer.push_back(interval);
            }
            else if(interval[1] < left){
                answer.push_back(interval);
            }
            else{
                left = min(left, interval[0]);
                right = max(right, interval[1]);
            }
        }
        if(!placed){
            answer.push_back({left, right});
        }
        return answer;
    }
};

这道题涉及到合并区间。我们首先遍历数组intervals,当某个区间和插入区间没有交集的时候,就直接push他,当有交集的时候,我们就要可以将这些区间和插入区间进行合并。

我们还设定了一个布尔值placed来判断这个区间的放置位置,当插入区间的最右边端点在遍历的区间的左侧的时候,那么这时候就不进行合并操作,就要将插入区间push,并且设置placed为true,然后再push遍历到的区间。

还有一种情况,插入区间的最右端点较大,以至于到最后一个区间进行的也是合并操作,这时候遍历结束,直接push经过合并的插入区间。

相关推荐
imDwAaY7 分钟前
Redis Set 如何节省内存?从整数集合到哈希表的设计取舍
数据结构·redis·散列表
yyy(十一月限定版)11 分钟前
CF2131D Arboris Contractio
算法
无名猿13 分钟前
map / set 完全指南:红黑树与有序容器
数据结构·c++·性能优化·stl·标准库
朝朝辞暮i20 分钟前
C++ 第 28 课:Lambda 表达式
开发语言·c++·算法
代码什么用23 分钟前
LeetCode-560.和为 K 的子数组
算法·leetcode
All for pursuit.27 分钟前
【回溯-3】39.组合总和
数据结构·c++·算法·leetcode
释厄62337 分钟前
BSD 基础论——不要忘记连接·不要停滞循环·AI基础算法
人工智能·算法
yi0111 小时前
DAY19: LeetCode 28 找出字符串中第一个匹配项的下标
人工智能·笔记·python·算法·leetcode
不会就选b1 小时前
算法日常・每日刷题--<动态规划>6
数据结构·算法·leetcode
释厄6231 小时前
AI犯错即异质论——正确认知=免疫与安全防控技术算法
大数据·算法·安全