Leetcode Merge Intervals 模拟

来源:互联网 发布:取消手机自动连接数据 编辑:程序博客网 时间:2024/06/06 02:26

思路:
先根据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;    }};
0 0