首页 > 其他 > 详细

57. Insert Interval (Array; Project)

时间:2015-12-05 11:13:43      阅读:131      评论:0      收藏:0      [点我收藏+]

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].

/**
 * 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:
    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
        if(intervals.empty()){
            intervals.push_back(newInterval);
            return intervals;
        }
        int left;
        int right;
        int size1;
        int size2;
        //find the first start which >= newInterval‘s end
        vector<Interval>::iterator itEnd = intervals.begin();
        for(; itEnd < intervals.end();itEnd++)
        {
            if(itEnd->start > newInterval.end) break;
        }
        
        //insert the interval in the way as merge interval
        vector<Interval>::iterator itStart = intervals.begin();
        size2 = newInterval.end - newInterval.start;
        for(; itStart < itEnd;itStart++)
        {
            left = min(itStart->start,newInterval.start);
            right = max(itStart->end,newInterval.end);
            size1 = itStart->end - itStart->start;
            if(right - left > size1 + size2) continue; //no overlapping
            
            //there‘s overlapping
            itStart->start=left;
            itStart->end=right;
            for(vector<Interval>::iterator it = itStart+1; it < itEnd; it++){ //the rest of interval should also merge with the new itStart
                left = min(itStart->start,it->start);
                right = max(itStart->end,it->end);
                size1 = itStart->end - itStart->start;
                size2 = it->end - it->start;
                if(right - left > size1 + size2){ //no more overlapping
                    intervals.erase(itStart+1,it);//erase the elem from itStart+1 to it-1
                    return intervals;
                }
                else{
                    itStart->start=left;
                    itStart->end=right;
                }
            }
            //all overlapping
            intervals.erase(itStart+1,itEnd);//erase the elem from itStart+1 to itEnd-1
            return intervals;
        }
        
        //no overlapping
        intervals.insert(itEnd,newInterval);//insert in the position itEnd
        return intervals;
    }
};

 

57. Insert Interval (Array; Project)

原文:http://www.cnblogs.com/qionglouyuyu/p/5021125.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!