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









猜你喜欢

转载自blog.csdn.net/Errors_In_Life/article/details/79280599
今日推荐