Merge Intervals && Insert Interval

Given a collection of intervals, merge all overlapping intervals.

Example 1:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

Example 2:

Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
class Solution {
public:
    /* 按照start 从小打到排序
     * 每次拿出一个interval 判断start 是否小于当前要返回的结果的 end (即判断与之前部分是否有交集)
     *
     * */
    vector<Interval> merge(vector<Interval>& intervals) {
        if(intervals.empty())   return {};
        vector<Interval> ret;
        // 使用匿名函数直接进行比价
        sort(intervals.begin(), intervals.end(),
                [](Interval &a, Interval &b){return a.start < b.start;});
        ret.push_back(intervals[0]);
        for(auto &inter : intervals){
            // 没有交集
            if(ret.back().end < inter.start)    ret.push_back(inter);
            
            // eg: [2, 9] [3, 4] 则不用更新当前end 只有[2, 9] [3, 12]这种才要更新end
            else if(ret.back().end < inter.end) ret.back().end = inter.end;
        }
        return ret;
    }
};

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:

Input: intervals = [[1,3],[6,9]], newInterval = [2,5]
Output: [[1,5],[6,9]]
class Solution {
public:
    /* 同merge interval 类似
     * 初始是排好序的 可以把newInterval 插在排序后的正确位置
     * 分三阶段:
     * 把没有重合的记录在res中
     * 处理重合区间
     * 记录剩余的没有重合的区间
     * */
    vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
        int cur=0, len=intervals.size();
        vector<Interval> ret;
        while(cur < len && intervals[cur].end < newInterval.start){
            ret.push_back(intervals[cur]);
            cur++;
        }

        // 设newInterval 始终维护一个覆盖相交区间
        while(cur < len && intervals[cur].start <= newInterval.end ){
            newInterval.start = min(newInterval.start, intervals[cur].start);
            newInterval.end = max(newInterval.end, intervals[cur].end);
            cur++;
        }
        ret.push_back(newInterval);
        while(cur < len ){
            ret.push_back(intervals[cur]);
            cur++;
        }
        return ret;
    }
};

猜你喜欢

转载自blog.csdn.net/futangxiang4793/article/details/88778193
今日推荐