中等
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5] 输出:[[1,5],[6,9]]
这题要拿待插入的区间与intervals中的区间合并,确定无法再合并后再插入,关键是把区间之间关系弄清楚.区间[l1,r1]和区间[l2,r2]不重合满足以下两个条件之一:
其他情况都是有交集的
有交集时,取两者的并集[min(l1,l2),max(r1,r2)],取并集后不能立即插入,因为这个区间可能还要和后面的区间合并
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> res;
if(intervals.size()==0){
res.push_back(newInterval);
return res;
}
bool flag=false;
int left=newInterval[0],right=newInterval[1];
for(const auto& interval : intervals){
//在插入区间右侧,无交集
if(interval[0]>right){
if(!flag){
res.push_back({left,right});
flag=true;//记录插入区间是否被插入了
}
res.push_back(interval);
}else if(interval[1]<left){
//在插入区间左侧且无交集
res.push_back(interval);
}else{
//与插入区间有交集,求出交集
left=min(left,interval[0]);
right=max(right,interval[1]);
}
}
if(!flag){
//插入区间如果还没被插入的话,现在插入
res.push_back({left,right});
}
return res;
}
};