难度困难
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
思路1:
遍历原始区间,将需要新加入的区间与当前所在区间对比,根据比较结果选择性添加区间情况。
情况1:新区间在当前区间右侧(无交集) -》 将当前区间加入结果;
情况2:新区间在当前区间左侧(无交集) -》 将新区间加入结果,再将剩余的全部区间加入结果;
情况3:新区间与当前区间存在交集 -》 更新新区间的范围,变为两个区间的交集;
情况1和情况3存在边界情况:若当区间已属于原区间的最后一部分,需要将新区间加入到结果中。
vector<vector<int>> insert(vector<vector<int>>& list, vector<int>& add) {
int len=list.size();
if(!len) {
return vector<vector<int>>(1,add);
}
vector<vector<int>> ans;
for(int i=0;i<len;++i){
if(list[i][1]<add[0]) {
ans.push_back(list[i]);
if(i==len-1) ans.push_back(add);
}
else if(list[i][0]>add[1]){
ans.push_back(add);
while(i<len){
ans.push_back(list[i++]);
}
break;
}
else{
add[0]=min(list[i][0],add[0]);
add[1]=max(list[i][1],add[1]);
if(i==len-1) ans.push_back(add);
}
}
return ans;
}
思路2:三个月前解答,思路重理ing。。。
vector<vector<int>> insert(vector<vector<int>>& list, vector<int>& add) { // 内存占用过大,尝试使用原向量解答
vector<vector<int>> res;
if(!list.size()) {res.push_back(add); return res;}
bool flg=false;
if(list[0][0]>add[0]){flg=true; res.push_back(add);}
else res.push_back(list[0]);
for(auto vec:list){
if( add[0] >res.back()[1] && add[0]<vec[0] && !flg) { flg=true; res.push_back(add);}
if( add[1]<vec[0] || !flg ){
if(vec[0]>res.back()[0] ) res.push_back(vec);
}
if((add[0]>=res.back()[0] && add[0]<=res.back()[1])||(add[1]>=res.back()[0] && add[1]<=res.back()[1])
||(add[0]<=res.back()[0] && add[1]>=res.back()[1])){
res.back()[0]=min(res.back()[0],min(add[0],vec[0]));
res.back()[1]=max(res.back()[1],max(add[1],vec[1]));
flg=true;
}
}
if(!flg) res.push_back(add);
return res;
}