leetcode#57 Insert Interval

给出一个无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:

输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
输出: [[1,5],[6,9]]

示例 2:

输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出: [[1,2],[3,10],[12,16]]
解释: 这是因为新的区间 [4,8][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()) return {newInterval};
        if(newInterval.end<intervals.begin()->start)
        {
            intervals.insert(intervals.begin(),newInterval);
            return intervals;
        }
        if(newInterval.start>intervals.back().end)
        {
            intervals.push_back(newInterval);
            return intervals; 
        }
        auto iter = intervals.begin();
        for (; iter != intervals.end(); ++iter)
            if (iter->end>= newInterval.start)  break;
        auto start = iter;
        auto end = start;
        for (; end != intervals.end(); ++end)
            if (end->start>newInterval.end) break;        
        int first = min(start->start,newInterval.start);
        int second =max( (end - 1)->end, newInterval.end);
        auto begin = start - intervals.begin();
        intervals.erase(start, end);
        intervals.insert(intervals.begin()+begin, { first,second });
        return intervals;
    }
    
        vector<Interval> insert1(vector<Interval>& intervals, Interval newInterval) {
        auto compare = [] (const Interval &intv1, const Interval &intv2)
                          { return intv1.end < intv2.start; };
        auto range = equal_range(intervals.begin(), intervals.end(), newInterval, compare);//找到i1.end>=new.start i2.end>new.start
        auto itr1 = range.first, itr2 = range.second;
        if (itr1 == itr2) {
            intervals.insert(itr1, newInterval);
        } else {
            itr2--;//我们修改最后一个元素的区间
            itr2->start = min(newInterval.start, itr1->start);
            itr2->end = max(newInterval.end, itr2->end);
            intervals.erase(itr1, itr2);
        }
        return intervals;
    }
};

猜你喜欢

转载自www.cnblogs.com/lsaejn/p/9758199.html