[leetcode]Insert Interval

来源:互联网 发布:淘宝电商怎么加盟代理 编辑:程序博客网 时间:2024/06/16 01:12

57. Insert Interval

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

思路:找出与插入的区间不重合的(分为左右两部分),然后再处理重合的与插入的区间。

vector<Interval> insert(vector<Interval>& intervals, Interval newInterval){    vector<Interval> left, right;    for (auto it : intervals)    {        if (it.end < newInterval.start)            left.push_back(it);        if (it.start > newInterval.end)            right.push_back(it);    }    if (left.size() + right.size() != intervals.size())    {        newInterval.start = min(newInterval.start, intervals[left.size()].start);        newInterval.end = max(newInterval.end, intervals[intervals.size() - right.size() - 1].end);    }    left.push_back(newInterval);    left.insert(left.end(), right.begin(), right.end());    return left;}

其中找不重合的区间可以使用二分法。利用upper_bound.

class Solution{private:    int upper_bound(const vector<Interval> &intervals, int target)    {        int count = intervals.size(), first = 0;        while (count > 0)        {            int pos = first + count / 2;            if (target >= intervals[pos].start)                first = ++pos, count -= (count / 2 + 1);            else                count /= 2;        }        return first;    }public:    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval)    {        int N = intervals.size();        vector<Interval> res;        int left = upper_bound(intervals, newInterval.start);        int right = upper_bound(intervals, newInterval.end);        if (left > 0 && intervals[left - 1].end >= newInterval.start && intervals[left - 1].start < newInterval.start)            newInterval.start = intervals[left - 1].start;        if (right > 0 && intervals[right - 1].start <= newInterval.end && intervals[right - 1].end > newInterval.end)            newInterval.end = intervals[right - 1].end;        for (int i = 0; i < left - 1; res.push_back(intervals[i++]));        if (left > 0 && intervals[left - 1].end < newInterval.start)            res.push_back(intervals[left - 1]);        res.push_back(newInterval);        for (int i = right; i < N; res.push_back(intervals[i++]));        return res;    }};