【leetcode】57. 插入区间(insert-interval)(模拟)[困难]

2023-05-16

链接

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

耗时

解题:2 h 17 min
题解:8 min

题意

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

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

思路

分为四种情况:

  1. 在头部插入
  2. 在结尾插入
  3. 在中间插入
  4. 与某些现存区间合并

解决:

  1. 判断是否为空,新增区间右端点是否小于列表第一个区间左端点。
  2. 不在中间插入或合并,就在结尾插入
  3. 在现存区间之间,但不能与现存区间合并
  4. 先找到 新增区间左端点 的插入位置,再找到 新增区间右端点 的插入位置,合并这之间的区间

时间复杂度: O ( n ) O(n) O(n)

AC代码

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        int l = newInterval[0];
        int r = newInterval[1];
        vector<vector<int>> ans;
        bool flag = true;
        int n = intervals.size();
        // no merge, begin add new interval
        if(intervals.empty() || r < intervals[0][0]) {
            ans.push_back(newInterval);
            flag = false;
        }
        for(int i = 0; i < n; ++i) {
            vector<int> tmp = {intervals[i][0], intervals[i][1]};
            if(flag) {
                if(l <= intervals[i][0] || l <= intervals[i][1]) {
                    int pos = i;
                    tmp[0] = min(l, intervals[i][0]);
                    while(i < n && (r > intervals[i][0] && r > intervals[i][1])) i++;
                    if(i == n) {
                        tmp[1] = r;
                    }
                    else {
                        if(r < intervals[i][0]) {
                            tmp[1] = r;
                            if(i != pos) i -= 1;
                        }
                        else {
                            tmp[1] = max(r, intervals[i][1]);
                        }
                    }
                    // middle add new interval
                    if(pos == i && (l < intervals[i][0] && r < intervals[i][0])) i -= 1;
                    flag = false;
                }
            }
            ans.push_back(tmp);
        }
        // no merge, end add new interval
        if(flag) {
            ans.push_back(newInterval);
        }
        return ans;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【leetcode】57. 插入区间(insert-interval)(模拟)[困难] 的相关文章

  • 插入后获取mysql的最后一个插入id

    我有一个这样的查询 INSERT INTO table1 field1 field2 VALUES value1 value2 ON DUPLICATE KEY UPDATE field1 value1 然后我想获取最后一个插入ID 如果它
  • 为什么 ENUM 在 MySQL 中不存储多个值?

    我想用ENUM表中的特征使用MySQL 我创建了一个表tbl test having id作为主键和enum col字段为ENUM数据类型 CREATE TABLE tbl test id INT NOT NULL AUTO INCREME
  • 高效的多SQL插入

    将 1000 行插入一个表 jdbc connector mysql 数据库 的最佳 最省时的方法是什么 它是一个缓冲区 每次满了都需要转储到数据库中 1 一条自动生成 连接的 SQL 语句 2 for int i 0 i lt 1000
  • 如何仅在少数列中插入数据,而其他列为空或像它们在mysql表记录中一样?

    我创建了一个名为 学生 的表 它有以下字段 roll no lt type Integer Not Null course name lt type varchar 40 Not Null std surname lt type varch
  • php PDO使用占位符批量插入多行

    我希望使用 PHP PDO 进行多次插入 我找到的最接近的答案是这个 如何将数组插入到单个 mysql 准备好的语句中 https stackoverflow com questions 4629022 how to insert an a
  • 在 JavaScript 中插入连字符

    在 JavaScript 中插入连字符的最简单方法是什么 我有一个电话号码 例如 1234567890 在前端显示时 我必须将其显示为123 456 7890使用 JavaScript 实现这一目标的最简单方法是什么 最快的方法是使用一些正
  • MS Access 插入不重复

    微软访问2003 表主 手机号文本 255 名字文本 255 姓氏文本 255 地址文本 255 表温度 手机编号文本 255 名字文本 255 姓氏文本 255 地址文本 255 主要有100条记录 临时有 30 条记录 两个表都有 10
  • SQL Server:无法将显式值插入时间戳列

    使用该语句时 create table demo ts timestamp insert into demo select current timestamp 我收到以下错误 无法将显式值插入时间戳列 将 INSERT 与列列表一起使用以排
  • 如何将字符串传递给批量插入而不是文件?

    我曾经使用批量插入命令来转换 Csv 文件 int 表 最近 我将 CSV 文件保存为 SQL Server 中的 VarBinary 值 现在我可以通过使用 CAST 和 CONVERT 函数将其类型转换为 Varchar 来从 Varb
  • MySql:插入一行并获取内容

    是否可以插入一行并获取在同一查询中插入的值 就像是 INSERT INTO items item number state SELECT 3 number state FROM item bug WHERE id 3 然后 获取ID并执行
  • 使用 pyodbc 从 Python 应用程序将值插入 Access 2003 数据库

    我过去经常检查 stackoverflow 并且总是能够找到我一直在寻找的东西 但我似乎无法让这个工作 所以我问我的第一个问题 我并不是一个真正的程序员 但我在工作中提到过Python 现在我有一个Python项目 实际上 我已经把一切都弄
  • 插入带有扭曲问题的选择

    我想将一个表 当然具有某个ID 的所有数据复制到同一个表中 但略有不同 我有这个表 产品数量 id groupId productId quantity 1 2 2 5 我想要做的是复制 groupId 2 的所有数据 将其插入到 grou
  • 在基于mysql中的选择的插入期间增加非自动增量字段

    我使用 select 语句将一个表中的记录插入到另一个表中 插入的表有一个新字段 该字段应在每次更新时递增 1 但不应是自动递增字段 因为每次更新每组记录的数字都需要重新开始 如果使用的 select 语句选择 42 条记录 则新表将具有一
  • 在 PHP 中的任意位置插入数组中的新项目

    如何将新项目插入到数组的任意位置 例如数组的中间 您可能会发现这更直观一些 它只需要一个函数调用array splice http www php net manual en function array splice php origin
  • 如何在选择查询中创建新列

    在 MS Access 中 我想将新列插入到选择查询的返回结果中 新列的每一行都具有相同的值 例如 我的选择返回列 A B 我希望 C 成为选择查询创建的新列 A B C a1 b1 c a2 b2 c a3 b3 c select A B
  • Mysql INSERT IGNORE 如果两列中的特定行值已经存在

    CurrencyAbbreviation CurrencyRate DateOfCurrencyRate AUD 1 1 2013 01 01 USD 1 1 2013 01 01 EUR 1 1 2013 01 01 想要防止插入具有相同
  • 在 WPF FlowDocument 中的指定位置插入超链接

    我想以编程方式将 WPF 超链接元素插入 FlowDocument 中 目标是创建一个工具栏按钮 该按钮将获取 RichTextBox 中的一系列文本并将其替换为超链接 它与您在网络上看到的用于在 wiki 或博客 或 StackOverf
  • MySql:将多项选择数据存储在数据库中

    我的表单中有一个复选框列表 用户可以选择其中任何一个 也可以选择全部 认为用户选择他感兴趣的运动类型 我需要最好的数据库结构来存储这个用户选择 这样 将来我就可以获得所有这些数据 我想 我无法将每个 用户 ID 运动 选择作为新行存储在数据
  • 如何将数据插入 Microsoft Access 数据库?

    我正在尝试将数据插入 Microsoft Access 数据库 我将数据插入到 Access 数据库中 但只有第一次和第二次显示我插入的数据 当我重建应用程序时 我插入的数据消失了 我不知道他们去了哪里并且没有出现 我使用 C 和 NET
  • MySQL INSERT 无需指定每个非默认字段(#1067 - “表”的默认值无效)

    我已经见过好几次了 我有一台服务器允许我插入一些值 而无需指定其他值 如下所示 INSERT INTO table SET value a a value b b value c 是一个没有设置默认值的字段 但在这里工作正常 当脚本移动到新

随机推荐