作者简介:C/C++ 、Golang 领域耕耘者,创作者
个人主页:作者主页
题目来源: leetcode官网
如果感觉博主的文章还不错的话,还请关注➕ 、点赞👍 、收藏🧡三连支持一下博主哦~~~
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例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]]
此题方法是模拟题
插入区间的题意理解如图示:

我们只需要模拟一下即可。
算法步骤:
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& a, vector<int>& b) {
vector<vector<int>> re;
int k = 0;
// 将左边完全没有交集的区间加到答案中
while(k < a.size() && a[k][1] < b[0]) re.push_back(a[k++]);
if(k < a.size())
{
// 更新左端点
b[0] = min(b[0], a[k][0]);
while(k < a.size() && a[k][0] <= b[1]) b[1] = max(b[1], a[k ++][1]); // 找到最右边断点,更新
}
re.push_back(b);
// 将右边无交集的区间加到答案中
while(k < a.size()) re.push_back(a[k ++]);
return re;
}
};
执行结果:

其中遍历一次, 时间复杂度为O(n)
如果觉得对你有帮助的话:
👍 点赞,你的认可是我创作的动力!
🧡 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习