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;
}
};
結果展示: