题目描述:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] ,合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

方法1:按左端点排序后再合并

56-2.png

intervals[i] [0] <= intervals[j] [0]

若intervals[i] [0] = intervals[j] [0] :可以合并

若intervals[i] [0] < intervals[j] [0]:

  • intervals[i] [1] < intervals[j] [0] 不可以合并

  • intervals[i] [1] > intervals[j] [0] 可以合并

如果intervals[i]和intervals[j]不可以合并,则intervals[i] [0] < intervals[j] [0],intervals[i] [1] < intervals[j] [0],则intervals[i] [0] < intervals[j+1] [0],intervals[i] [1] < intervals[j+1] [0],则j后面的全部都不可以和intervals[i]合并

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end());
        vector<vector<int>> merge;
        for(int i=1;i<intervals.size();i++){
            if(intervals[i][0] == intervals[i-1][0]) intervals[i][1] = max(intervals[i][1],intervals[i-1][1]);
            else{
                if(intervals[i][0] > intervals[i-1][1] ) merge.push_back(intervals[i-1]);//第i-1个数组后面也一定不会被合并了
                else {
                    intervals[i][0] = intervals[i-1][0];
                    intervals[i][1] = max(intervals[i][1],intervals[i-1][1]);
                }
            }
        }
        merge.push_back(intervals[intervals.size()-1]);//把最后一个合并后的也加进去
        return merge;
    }
};