LeetCode第 56 题:合并区间 (C++)

56. 合并区间 - 力扣(LeetCode)
在这里插入图片描述

总感觉题意不是很明确。

所以代码不停的修改去适应给出的例子与其他输入。。。

先按区间的左元素快速排序,之后可以合并的区间必然是相邻的

注意用来排序的对象与排序算法中交换操作的对象是不同的。

排序之后需要进行合并,需要合并的区间都是连续的,利用双指针在序列里找到可以合并的区间,一边找一遍合并。合并结束之后更新beg,end指针到刚才合并区间的下一个
,继续寻找。
在这里插入图片描述

class Solution {
public:
    int partition(vector<vector<int>> &a, int beg, int end){
        auto &key = a[end]; //探针为key[0]
        while(beg < end){
            while(beg < end && a[beg][0] <= key[0])
                ++beg;
            while(beg < end && a[end][0] >= key[0])
                --end;
            swap(a[beg], a[end]);
        }
        swap(key, a[beg]);
         return beg;
    }
    void quicksort(vector<vector<int>> &a, int beg, int end){
        if(beg >= end)  return;
        auto p = partition(a, beg, end);
        quicksort(a, beg, p-1);
        quicksort(a, p+1, end);
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n = intervals.size();
        quicksort(intervals, 0, n-1);
        vector<vector<int>> vec;
        int beg =  0;
        int end = beg;
        while( end < n-1){
            while(end < n-1 && intervals[end][1] >= intervals[end+1][0]){
                intervals[end+1][1] = max(intervals[end][1], intervals[end+1][1]);
                ++end;
            }
            intervals[end][0] = intervals[beg][0];

            vec.push_back(intervals[end]);
            beg = end +1;
            end = beg;
        }
        if(end == n-1)    vec.push_back(intervals[end]); //最后只剩下一个元素的情况
        return vec;
    }
};

上面我是自己写了快排,如果嫌麻烦的话,这样也是可以排序的:

sort(intervals.begin(), intervals.end());

不过性能并不太好。

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        int n = intervals.size();
        sort(intervals.begin(), intervals.end());
        vector<vector<int>> vec;
        int beg =  0;
        int end = beg;
        while( end < n-1){
            while(end < n-1 && intervals[end][1] >= intervals[end+1][0]){
                intervals[end+1][1] = max(intervals[end][1], intervals[end+1][1]);
                ++end;
            }
            intervals[end][0] = intervals[beg][0];

            vec.push_back(intervals[end]);
            beg = end +1;
            end = beg;
        }
        if(end == n-1)    vec.push_back(intervals[end]); //最后只剩下一个元素的情况
        return vec;
    }
};

换种写法:

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end());
        int beg = 0, end = 0;
        vector<vector<int>> res;
        while(end < intervals.size()){
            int a = intervals[beg][0], b = intervals[beg][1];
            while(end < intervals.size()-1 && b >= intervals[end+1][0]){
                b = max(b, intervals[end+1][1]);
                ++end;
            }
            res.push_back({a, b});
            beg = end + 1;
            end = beg;
        }
        if(end == intervals.size()-1)   res.push_back(intervals[end]);//只剩下一个元素
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值