输入:一个新区间,以及有序的,无重叠的老区间数组。
解法一:合并解法
正常来说,把新区间加入,然后排序线性合并,也是56题的思路。这种是完全没有问题的。但是排序实在是太慢,而且本来只需要加入即可,没必要排序。
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
intervals.push_back(newInterval);
sort(intervals.begin(), intervals.end());
vector<vector<int>> ret{intervals[0]};
for(int i=1;i<intervals.size();i++)
{
if(intervals[i][0] <= ret.back()[1])
{
vector<int> tmp{ret.back()[0], max(ret.back()[1], intervals[i][1])};
ret.pop_back();
ret.push_back(tmp);
}
else ret.push_back(intervals[i]);
}
return ret;
}
};
解法二:线性插入+栈
找到位置,插入,再按老方法处理,直接完事。
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
// 插入
int inserted = 0;
for(int i=0;i<intervals.size();i++)
{
if(newInterval[0] <= intervals[i][0])
{
intervals.insert(intervals.begin()+i, newInterval);
inserted = 1;
break;
}
}
if(!inserted)intervals.push_back(newInterval);
// 处理
vector<vector<int>> ret{intervals[0]};
for(int i=1;i<intervals.size();i++)
{
if(intervals[i][0] <= ret.back()[1])
{
vector<int> tmp{ret.back()[0], max(ret.back()[1], intervals[i][1])};
ret.pop_back();
ret.push_back(tmp);
}
else ret.push_back(intervals[i]);
}
return ret;
}
};