一个有N个区间的数组,会被分成2N+1份,比较寻找newInterval的start和end分别在哪个区间内,合并中间囊括的所有区间。
注意:下面代码因为枚举类型只设置了BEFORE与CONTAIN两种情况,无法表示newInterval的end在数组最后的情况,需单独编写代码。
时间复杂度:O(N)
C++代码:
class Solution {
enum pos{BEFORE,CONTAIN};
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
if (intervals.empty())
return { newInterval };
if (newInterval.end < intervals[0].start) //newInterval在所有interval之前
{
intervals.insert(intervals.begin(), newInterval);
return intervals;
}
if (newInterval.start > (intervals.end() - 1)->end) //newInterval在所有interval之后
{
intervals.push_back(newInterval);
return intervals;
}
if (newInterval.end > (intervals.end() - 1)->end) //newInterval的end在所有interval之后
{
for (auto it = intervals.begin(); it < intervals.end(); it++)
{
if (it->start > newInterval.start)
{
int insert_pos = it - intervals.begin();
intervals.erase(it, intervals.end());
intervals.insert(intervals.begin()+insert_pos, newInterval);
return intervals;
}
if (it->end >= newInterval.start)
{
int insert_pos = it - intervals.begin();
intervals.erase(it, intervals.end());
intervals.insert(intervals.begin() + insert_pos, Interval(it->start, newInterval.end));
return intervals;
}
}
}
pos start_pos, end_pos;
vector<Interval>::iterator start_it, end_it;
for (auto it = intervals.begin(); it < intervals.end(); it++)
{
if (it->start > newInterval.start)
{
start_it = it;
start_pos = BEFORE;
break;
}
if (it->end >= newInterval.start)
{
start_it = it;
start_pos = CONTAIN;
break;
}
}
for (auto it = start_it; it < intervals.end(); it++)
{
if (newInterval.end < it->start)
{
end_it = it;
end_pos = BEFORE;
break;
}
if(newInterval.end <= it->end)
{
end_it = it;
end_pos = CONTAIN;
break;
}
}
if (start_pos == BEFORE && end_pos == BEFORE)
{
int insert_pos = start_it - intervals.begin();
intervals.erase(start_it, end_it);
intervals.insert(intervals.begin() + insert_pos, newInterval);
}
else if (start_pos == CONTAIN && end_pos == CONTAIN)
{
Interval temp(start_it->start, end_it->end);
int insert_pos = start_it - intervals.begin();
intervals.erase(start_it, end_it + 1);
intervals.insert(intervals.begin() + insert_pos, temp);
}
else if (start_pos == BEFORE && end_pos == CONTAIN)
{
Interval temp(newInterval.start, end_it->end);
int insert_pos = start_it - intervals.begin();
intervals.erase(start_it, end_it + 1);
intervals.insert(intervals.begin() + insert_pos, temp);
}
else if (start_pos == CONTAIN && end_pos == BEFORE)
{
Interval temp(start_it->start, newInterval.end);
int insert_pos = start_it - intervals.begin();
intervals.erase(start_it, end_it);
intervals.insert(intervals.begin() + insert_pos, temp);
}
return intervals;
}
};