LeetCode修仙:Insert Interval

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









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章