1.题目要求在一些现在区间vector中,插入一个新的区间,并更新整个区间集(如果发生交集)。
2.主要思路是遍历一遍(时间复杂度为O(n)),查询当前的区间是否能插入的区间发生合并,合并分为四种情况:相交有两种([2,5]和[4,6]一前一后相交,[4,6]和[2,5]一后一前相交),包含有两种([1,7]和[4,6]包含,[4,6]和[1,7]被包含)。
3.如果发生合并,记录合并的位置,把之前没有收到影响的区间直接压入新集合,从合并的位置开始使用Merge Intervals的方法进行合并检测。
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].
 
AC代码:
[c language=”++”]
/**
 * 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:
	static bool cmp(const Interval&a, const Interval&b)
	{
		return a.start < b.start;
	}
    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
        vector<Interval> result=intervals;
        bool isMerge=false;
        int changeIdx=-1;//记录被改变区间的位置
        for(int i=0;i<result.size();i++)
        {
            if( (newInterval.start<=result[i].end && newInterval.start>=result[i].start )
                ||(newInterval.end>=result[i].start && newInterval.end<=result[i].end )
                ||(newInterval.start<=result[i].start && newInterval.end>=result[i].end )
                ||(newInterval.start>=result[i].start && newInterval.end<=result[i].end ))
            {/*共分四种情况:
            相交有两种([2,5]和[4,6]一前一后相交,[4,6]和[2,5]一后一前相交)
            包含有两种([1,7]和[4,6]包含,[4,6]和[1,7]被包含)*/
                isMerge=true;//进行了合并,标记
                changeIdx=i;//记录被改变区间的位置
                result[i].start=min(result[i].start,newInterval.start);
                result[i].end=max(result[i].end,newInterval.end);
                break;
            }
        }
        if(!isMerge)
        {//没有发生合并,证明新区间与现有的区间没有交集,直接压入并排序
            result.push_back(newInterval);
		    sort(result.begin(), result.end(), cmp);
		    return result;
        }
        else
        {//进行了合并
            vector<Interval> result2(0);
            for(int i=0;i<changeIdx;i++)
            {//前面的区间没有受影响,直接压进去即可
                result2.push_back(result[i]);
            }
            int start=result[changeIdx].start;
            int cover=result[changeIdx].end;
            for(int i=changeIdx+1;i<result.size();i++)
            {//从受影响的区间开始考虑合并,如Merge Intervals的做法
                if (result[i].start <= cover)
				    cover = max(cover, result[i].end);
    			else
    			{
    				result2.push_back(Interval(start, cover));
    				start = result[i].start;
    				cover = result[i].end;
    			}
            }
            //把最后的一个区间压进去
		    result2.push_back(Interval(start, cover));
            return result2;
        }
    }
};
[/c]
