一种很简洁的方法,只需要三个while循环,时间复杂度为O(n)
第一个while循环负责在n新区间左部的,第二个while负责和新区间重合的,第三个while循环负责在新区间右部的。
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
vector<Interval> rtn;
auto it = intervals.begin();
while (it != intervals.end() && it->end < newInterval.start) rtn.push_back(*(it++));
while (it != intervals.end() && it->start <= newInterval.end) {
if (it->start < newInterval.start) newInterval.start = it->start;
if (it->end > newInterval.end) newInterval.end = it->end;
it ++;
}
rtn.push_back(newInterval);
while (it != intervals.end()) rtn.push_back(*(it++));
return rtn;
}
};
另外,可以通过二分查找的办法寻找和新区间重合的区间的序号。