Merge Intervals

Q:

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

很久没有写快排了,尝试着写了一下,耗时还不多,但是这tnnd网速搞的我要崩溃啊。每次提交的时间比写代码的时间还长。我操他大爷。

数组排序之后一次遍历就能搞定,线段树应该也是可以做的。但是好像比这个要麻烦一点吧。什么时候该找一些线段树的题切一切了。

A:

class Solution {
public:
    vector<Interval> merge(vector<Interval> &intervals) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        vector<Interval> res;
        int len = intervals.size();
        QuickSort(intervals, 0, len - 1);
        int pos = 0;
        while (pos < len) {
            Interval merged_val = intervals[pos];
            while (pos + 1 < len && merged_val.end >= intervals[pos + 1].start) {
                merged_val.end = max(merged_val.end, intervals[pos + 1].end);
                ++pos;
            }
            res.push_back(merged_val);
            ++pos;
        }
        return res;
    }
 private:
    void QuickSort(vector<Interval>& intervals, int begin, int end) {
        if (begin >= end) return;
        if (end - begin == 1) {
            if (intervals[begin].start > intervals[end].start) {
                swap(intervals[begin], intervals[end]);
            }
            return;
        }
        int st = begin;
        int head = begin + 1;
        int tail = end;
        while (head <= tail) {
            while (head <= end && intervals[head].start <= intervals[st].start) ++head;
            while (tail >= begin && intervals[tail].start > intervals[st].start) --tail;
            if (head < tail) {
                swap(intervals[head], intervals[tail]);
            }
        }
        swap(intervals[tail], intervals[st]);
        QuickSort(intervals, begin, tail - 1);
        QuickSort(intervals, tail + 1, end);
    }
};

 

posted @ 2013-06-14 00:30  dmthinker  阅读(142)  评论(0)    收藏  举报