思路一:可以用LeetCode 55. Merge Intervals的方法,将输入合并,并返回。这样是排序的复杂度 —— O(nlogn)
思路二:遍历intervals, O(n)实现
只有当it->end<newInterval.start || it->start>newInterval.end时,才将*it压入返回值。其他情况当前线段都将有和newIntervals重叠的部分:
1. it->start<newInterval.start, *it后半部分与newInterval重叠,更新newInterval.start至it->start
2. it->end> newInterval.end, *it前半部分与newInterval重叠,更新newInterval.end至it->end
3. newInterval在*it之间,更新newInterval的两端。
4. *it在newInterval之间,不更新,跳过当前的*it.
最后再遍历一遍intervals, 将新的newInterval插入返回值中。
代码:
class Solution
{
public:
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval)
{
vector<Interval> ret;
for (auto it = intervals.begin(); it != intervals.end(); ++ it)
{
if (it->end<newInterval.start || it->start>newInterval.end)
{
ret.push_back( *it );
} else if (it->start<newInterval.start &&
it->end>=newInterval.start && it->end<=newInterval.end)
{
newInterval.start = it->start;
} else if (it->end>newInterval.end &&
it->start>=newInterval.start && it->start<=newInterval.end)
{
newInterval.end = it->end;
} else if (it->start<=newInterval.start && it->end>=newInterval.end)
{
newInterval.start = it->start;
newInterval.end = it->end;
}
}
auto it = ret.begin();
for ( ; it != ret.end(); ++ it)
{
if (it->start > newInterval.end)
{
intervals.insert(it, newInterval);
break;
}
}
if (it == ret.end())
{
ret.push_back( newInterval );
}
return ret;
}
};