Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Given intervals [1,3],[6,9]
, insert and merge [2,5]
in as [1,5],[6,9]
.
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16]
, insert and merge [4,9]
in as [1,2],[3,10],[12,16]
.
This is because the new interval [4,9]
overlaps with [3,5],[6,7],[8,10]
.
分析:
先查找重合的部分,确定交叠的左右边界,这时有3种可能:
1. left>right,说明没有查找到,直接插入;
2. left==right,这时只需要融合,不需要删除;
3. left<right,这时需要融合之后删除多余的区间。
注意STL中vector.erase函数在使用时输入的两个边界,其中左边界是需要删除的第一个位置,右边界是需要删除的最后一个位置的下一个位置。
/**
* 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) {
int n=intervals.size(),x=newInterval.start,y=newInterval.end,left=0,right=n-1;
for(left=0;left<n;++left)
if(x<=intervals[left].end)
break;
for(right=n-1;right>=0;--right)
if(y>=intervals[right].start)
break;
if(left>right)//not found
{
intervals.push_back(newInterval);
for(int i=n;i>right+1;--i)
{
intervals[i].start=intervals[i-1].start;
intervals[i].end=intervals[i-1].end;
}
intervals[right+1].start=x;
intervals[right+1].end=y;
}
else
{
intervals[left].start=min(x,intervals[left].start);
intervals[left].end=max(y,intervals[right].end);
if(right>left)
intervals.erase(next(intervals.begin(),left+1),next(intervals.begin(),right+1));
}
return intervals;
}
};