1. 题目

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

2. 思路

序列自身的递增且无交的。
找到待插入位置,然后对这个位置开始往后进行merge。

3. 代码

/**
 * 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) {
        auto it = intervals.begin();
        while (it != intervals.end()) {
            if (newInterval.start > (*it).end) {
                it++;
            } else {
                break;
            }
        }
        if (it == intervals.end()) {
            intervals.push_back(newInterval);
            return intervals;
        }
        // now: it.end >= newInterval.start
        if ((*it).start > newInterval.start) {
            it = intervals.insert(it, newInterval);
        } else {
            (*it).end = max((*it).end, newInterval.end);
        }
        merge(intervals, it);
        return intervals;
    }
    
    void merge(vector<Interval>& ivs, vector<Interval>::iterator beg) {
        auto it = beg;
        while (it != ivs.end()) {
            if (beg->end >= it->end) {
                it++;
                continue;
            } else if (beg->end >= it->start) {
                beg->end = it->end;
                it++;
            }
            break;
        }
        ivs.erase(beg+1, it);
        return ;
    }
};

knzeus
72 声望28 粉丝

行万里路,读万卷书