57.插入区间
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
- 先确定插入位置,然后再考虑合并问题,究极恐怖枚举。不过效率还不错
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
if(intervals.size() == 0) return {newInterval};
vector<vector<int> > res;
int lpos=0,rpos=0;
for(int i = 0;i < intervals.size();i++){
if(intervals[i][0] < newInterval[0]) lpos++;
if(intervals[i][1] < newInterval[1]) rpos++;
}
if(lpos > rpos){
return intervals;
}
if(rpos == 0){
if(intervals[rpos][0] > newInterval[1]){
res.push_back(newInterval);
for(int i = 0;i < intervals.size();i++){
res.push_back(intervals[i]);
}
}
else{
res.push_back({newInterval[0],intervals[0][1]});
for(int i = 1;i < intervals.size();i++){
res.push_back(intervals[i]);
}
}
}
else if(lpos == 0){
if(rpos == intervals.size()){
res.push_back(newInterval);
}
else if(intervals[rpos][0] > newInterval[1]){
res.push_back(newInterval);
for(int i = rpos;i < intervals.size();i++){
res.push_back(intervals[i]);
}
}
else if(intervals[rpos][0] <= newInterval[1]){
res.push_back({newInterval[0],intervals[rpos][1]});
for(int i = rpos+1;i < intervals.size();i++){
res.push_back(intervals[i]);
}
}
}
else{
if(intervals[lpos-1][1] >= newInterval[0] && rpos == intervals.size()){
for(int i = 0;i < lpos-1;i++){
res.push_back(intervals[i]);
}
res.push_back({intervals[lpos-1][0],newInterval[1]});
}
else if(intervals[lpos-1][1] < newInterval[0] && rpos == intervals.size()){
for(int i = 0;i < lpos;i++){
res.push_back(intervals[i]);
}
res.push_back(newInterval);
}
else if(intervals[lpos-1][1] >= newInterval[0] && intervals[rpos][0] <= newInterval[1]){
for(int i = 0;i < lpos-1;i++){
res.push_back(intervals[i]);
}
res.push_back({intervals[lpos-1][0],intervals[rpos][1]});
for(int i = rpos+1;i < intervals.size();i++){
res.push_back(intervals[i]);
}
}
else if(intervals[lpos-1][1] >= newInterval[0] && intervals[rpos][0] > newInterval[1]){
for(int i = 0;i < lpos-1;i++){
res.push_back(intervals[i]);
}
res.push_back({intervals[lpos-1][0],newInterval[1]});
for(int i = rpos;i < intervals.size();i++){
res.push_back(intervals[i]);
}
}
else if(intervals[lpos-1][1] < newInterval[0] && intervals[rpos][0] > newInterval[1]){
for(int i = 0;i <= lpos-1;i++){
res.push_back(intervals[i]);
}
res.push_back({newInterval[0],newInterval[1]});
for(int i = rpos;i < intervals.size();i++){
res.push_back(intervals[i]);
}
}
else if(intervals[lpos-1][1] < newInterval[0] && intervals[rpos][0] <= newInterval[1]){
for(int i = 0;i <= lpos-1;i++){
res.push_back(intervals[i]);
}
res.push_back({newInterval[0],intervals[rpos][1]});
for(int i = rpos+1;i < intervals.size();i++){
res.push_back(intervals[i]);
}
}
}
return res;
}
};
通过时间:

本文深入解析了在已排序的无重叠区间列表中插入新区间并保持有序且不重叠的算法实现。通过C++代码示例,展示了如何确定新区间的插入位置,并在必要时合并区间以保持列表的有序性和连续性。
377

被折叠的 条评论
为什么被折叠?



