Leetcode Merge Intervals 模拟

思路:
先根据start值排序,然后两两merge,每一次的merge,将无用的那个区间的start值大于end值,最后delete这样的非法区间。

时间复杂度O(NlogN),空间复杂度O(N)。

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
class Solution {
public:

    void quick_sort(vector<Interval> &array, int left, int right) {
        if(left < right) {
            int i = left;
            int j = right;
            Interval x = array[i];
            while(i < j) {
                while(i < j && array[j].start >= x.start) {
                    --j;
                }
                if(i < j) {
                    swap(array[i], array[j]);
                    ++i;
                }

                while(i < j && array[i].start < x.start) {
                    ++i;
                }
                if(i < j) {
                    swap(array[i], array[j]);
                    --j;
                }
            }
            array[i] = x;
            quick_sort(array, left, i - 1);
            quick_sort(array, i + 1, right);
        }
    }

    void clear(Interval &x) {
        x.start = 1;
        x.end = 0;
    }

    vector<Interval> merge(vector<Interval>& intervals) {
        vector<Interval> res;
        if(intervals.empty()) return res;
        // sort
        quick_sort(intervals, 0, intervals.size() - 1);
        // merge
        for(int i = 0; i < intervals.size() - 1; ++i) {
            if(intervals[i + 1].start <= intervals[i].end) {
                intervals[i + 1].start = intervals[i].start;
                intervals[i + 1].end = intervals[i].end > intervals[i + 1].end ? intervals[i].end : intervals[i + 1].end;
                clear(intervals[i]);
            }
        }
        // delete
        for(int i = 0; i < intervals.size(); ++i) {
            if(intervals[i].end >= intervals[i].start) {
                res.push_back(intervals[i]);
            }
        }

        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值