Problem:
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]
.
思路:
这道题,看起来很简单,就是一个众多区间集合的合并,但是需要考虑的情况很多:集合为空,insert区间为第一个,insert区间横跨整个集合,insert区间在最后且包含在在集合最后一个区间内......情况很多很多,需要的是耐心——如果一味地想一个情况、解决一种情况,我们称:这样得解决问题是有效的、但没有意义的;代码的终极想法是迎合众多可能:应该会出现的和低概率出现的;LeetCode上面的测试集做得很好,很适合我们代码提高。
因此,我给出的初步解决方案如下图:
上述是核心算法的走势;
代码:
class Solution {
public:
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
int merge_s=-1;
int merge_e=-1;
int Has_merge=0,i=0;
Interval temp;
vector<Interval> answer;
for(int i=0; i<intervals.size(); i++)
{
if(Has_merge==1)
{
answer.push_back(intervals[i]);
continue;
}
if(intervals[i].end<newInterval.start)
{
answer.push_back(intervals[i]);
continue;
}
else
{
merge_s=min(newInterval.start,intervals[i].start);
for(int j=i; j<intervals.size(); j++)
{
if(intervals[j].start>newInterval.end)
{
merge_e=(j>0)? max(newInterval.end,intervals[j-1].end):newInterval.end;
temp.start=merge_s;
temp.end=merge_e;
answer.push_back(temp);
Has_merge=1;
j=j-1;
i=j;
break;
}
}
if(Has_merge!=1)
{
merge_e=max(intervals[intervals.size()-1].end,newInterval.end);
temp.start=merge_s;
temp.end=merge_e;
answer.push_back(temp);
break;
}
}
}
if(merge_s==-1 && merge_e==-1) //规避insert区间在一头一尾的情况
{
answer.push_back(newInterval);
}
return answer;
}
};
结果展示: