力扣-56-合并区间

题目

排序,我们会发现能合并区间的在排序后一定是连续的。如下图:

 

排序后,前后两个区间有以下三种情况:



 

那么我们就判断橙线的左端点和蓝线的右端点之间的关系,来判断是否合并。若能合并,合并区间的右端点是两条线的最大右端点。

 

#include <algorithm>
#include <vector>

/*bool cmp(vector<int> x, vector<int> y){ //对vector按照左端点排序
    return x[0] < y[0];
}
*/

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if (!intervals.size()) return {};
        sort(intervals.begin(), intervals.end());
        vector<vector<int>> result;
        for(const auto& array:intervals){
            if (result.empty() || array.front() > result.back()[1]) {
                result.push_back(array);
            }
            else{
                result.back()[1] = max(result.back()[1], array.back());
            }
        }
        return result;
    }
};

 

 

当然也可以用双指针对数组区间进行操作,用end来保存合并区间的最右端,更新即可。

#include <algorithm>
#include <vector>
/*排序+双指针*/
/*能进行合并的区间排序后一定是连续的*/
/*end维护合并区间的右端点*/
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if (!intervals.size()) return {};
        sort(intervals.begin(), intervals.end());
        vector<vector<int>> result;
        for(int i = 0; i < intervals.size();){
            int end = intervals[i][1];
            int j = i + 1;
            while(j < intervals.size() && intervals[j][0] <= end){    //能进行合并
                end = max(end, intervals[j][1]);
                j++;
            }
            result.push_back({intervals[i][0], end});       
            i = j;
        }
        return result;
    }
};

 

 

 

posted @ 2020-07-18 10:32  Peterxiazhen  阅读(201)  评论(0编辑  收藏  举报