56. Merge Intervals

思路:
因为数组中可能有重叠的部分,而重叠的要求是 [L1,R1]和[L2,R2]相比 L2<=R1那么这两个数组就重叠。根据这个性质,我们能得到判断条件
如果R1<L2,那么我们就不用处理重叠,否则我们就需要取R1=max(R1,R2)。为什么是R1等于呢?因为我们默认[L1,R1]在存放结果的数组里面,而[L2,R2]是新拿出的数组用来比较的。所以我们对[L,R]的L进行升序排序,这样就能尽可能的把有重叠的数组放在一起,让重叠的数组尽可能连续。
又考虑到我们存放结果的数组需要有数组被对比,所以我们先把给的数组的第一个数组加入进去。
那么总的做法就是,对原数组排序,定义一个存放结果的数组res,遍历排序后的数组,判断存放结果的数组是否为空或者R1<L2,是就把遍历到的数组加入进res,否则就判断 R1和R2谁大,大的赋值给R1。
代码:

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n=intervals.size();
        sort(intervals.begin(),intervals.end());
        vector<vector<int>> res;
        for(auto& num:intervals){
            int l=num[0],r=num[1];
            if(res.empty()||res.back()[1]<l){
                res.push_back(num);
            }
            else{
                res.back()[1]=max(r,res.back()[1]);
            }
        }
        return res;
    }
};

另一种双指针,先把一个指针用来指向一个区间的开始,然后另一个指针一直右移直到指到的区间不再重叠,这个过程会一直寻找最大的右边界。当这个重叠的区间找到后,就移动前一个指针,指向下一个区间的开始。

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n=intervals.size();
        sort(intervals.begin(),intervals.end());
        vector<vector<int>> res;
        for(int i=0;i<n;){
            int temp = intervals[i][1];
            int j=i+1;
            while(j<n&&intervals[j][0]<=temp){
                temp = max(temp,intervals[j][1]);
                j++;
            }
            res.push_back({intervals[i][0],temp});
            i=j;

        }
        return res;
    }
};
posted @ 2021-04-10 13:48  Mrsdwang  阅读(31)  评论(0编辑  收藏  举报