leetcode56 区间合并

题目:给出一个区间集合,求合并所有重叠后的区间。

分析:区间处理先上套路,按左端点作第一维,右端点作第二维进行排序。依次考察每个区间,假设前面所有区间合并后是[left, right],若当前区间的左端点小于等于right,right=max(right, 当前区间的右端点);否则说明有空格,将[left, right]加入答案,新区间作为[left, right]。

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n = intervals.size();
        if(n == 0)  return {};
        vector<vector<int>>ans;
        vector<pair<int, int>>myinter;
        for(int i = 0;i < n;i++)
            myinter.push_back(make_pair(intervals[i][0], intervals[i][1]));
        sort(myinter.begin(), myinter.end());

        int left = myinter[0].first, right = myinter[0].second;
        for(int i = 1;i < n;i++)
        {
            if(myinter[i].first <= right)  
                right = max(right, myinter[i].second);
            else
            {
                ans.push_back(vector<int>{left, right});
                left = myinter[i].first;
                right = myinter[i].second;
            }
        }
        ans.push_back(vector<int>{left, right});
        return ans;
    }
};

推荐用pair实现,因为pair会自动将first作第一关键字,second作第二关键字排序,这样就不用自己写个cmp函数。

posted @ 2020-04-16 11:37  Rogn  阅读(264)  评论(2编辑  收藏  举报