[LeetCode] Insert Interval

2014-11-24 07:16:06 · 作者: · 浏览: 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].

问题描述:给定一个不重叠的区间的集合,向这个集合中插入一个新的区间,必要的时候进行合并。初始时,区间集合中的区间已经按照它们的起始时间升序排列。

这道题和前面的Merge Intervals类似,Merge Intervals是将一个区间集合中的可以合并的进行合并,因此,这里可以将这个新区间按其实时间的升序排列插入到区间集合中,然后调用Merge Intervals中的merge()函数,这样未免太简单了哦?

这里采用另外的方法,依次遍历区间集合中的集合,如果集合中的当前区间的起始时间大于新区间的结束时间,说明后面的区间就不用遍历了,此时可以直接推出;否则,就判断当前区间是否与新的区间有重叠,如果有,就可以分别设置第一个和最后一个与新的区间有重叠的迭代器。在循环之外,首先判断是否有区间与新的区间重叠,如果没有,就将新的区间插入到刚最后遍历的区间的前面,否则,说明有区间与新的区间重叠,然后修改第一个与新区间有重叠的区间的起始和结束时间,最后删除中间的区间,然后返回区间集合。

/**
 * 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:
    bool is_mixed(const Interval &i1, const Interval &i2)
    {
        if(i1.start > i2.end)
            return false;
        else if(i1.end < i2.start)
            return false;
        else
            return true;
    }

    vector
  
    insert(vector
   
     &intervals, Interval newInterval) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(intervals.size() == 0) return vector
    
     (1, newInterval); int cnt = 0; bool begin_set= false, end_set = false; vector
     
      ::iterator iter1 = intervals.end(), iter2 = intervals.end(); vector
      
       ::iterator iter; for(iter = intervals.begin(); iter != intervals.end(); ++iter) { if(newInterval.end < (*iter).start) { break; } else { if(is_mixed(newInterval, *iter)) { if(!begin_set) { iter1 = iter; begin_set = true; } else { iter2 = iter; end_set = true; } ++cnt; } } } if(cnt == 0) { intervals.insert(iter, newInterval); return intervals; } (*iter1).start = min(newInterval.start, (*iter1).start); if(end_set) (*iter1).end = max(newInterval.end, (*iter2).end); else (*iter1).end = max(newInterval.end, (*iter1).end); if(end_set && iter1 + 1 != intervals.end()) intervals.erase(iter1 + 1, iter2 + 1); return intervals; } };