
【leetcode】57. 插入区间(insert-interval)(模拟)[困难]
发布日期:2021-05-13 21:40:20
浏览次数:12
分类:精选文章
本文共 1355 字,大约阅读时间需要 4 分钟。
链接
耗时
解题:2 h 17 min
题解:8 min题意
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
思路
分为四种情况:
- 在头部插入
- 在结尾插入
- 在中间插入
- 与某些现存区间合并
解决:
- 判断是否为空,新增区间右端点是否小于列表第一个区间左端点。
- 不在中间插入或合并,就在结尾插入
- 在现存区间之间,但不能与现存区间合并
- 先找到 新增区间左端点 的插入位置,再找到 新增区间右端点 的插入位置,合并这之间的区间
时间复杂度: O ( n ) O(n) O(n)
AC代码
class Solution { public: vector> insert(vector >& intervals, vector & newInterval) { int l = newInterval[0]; int r = newInterval[1]; vector > 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 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; }};
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年05月03日 15时54分08秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
第三方库jieba的安装方法
2021-05-15
在PyCharm切换Python2和Python3
2021-05-15
Burpsuite工具的证书安装
2021-05-15
PTA【C语言】求整数段和
2021-05-15
C++ 继承 详解
2021-05-15
数据链路层
2021-05-15
OSPF多区域
2021-05-15
Grafana导入 Promethus node模板
2021-05-15
MySQL的操作
2021-05-15
ARM裸机知识
2021-05-15
算术运算符
2021-05-15
MySQL学习之《查询数据》
2021-05-15
java设计模式--代理模式
2021-05-15
如何提高SQL查询的效率?
2021-05-15
Docker入门之-镜像(二)
2021-05-15
设置canvas图作为背景图?亲测有效
2021-05-15
搭建Docker本地 Registry
2021-05-15
数据结构——链表(3)
2021-05-15
32位机器与64位机器在编程方面的差别
2021-05-15
socket模块和粘包现象
2021-05-15