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].

A:

写一个快排,显然没有stl的好阿。

/**

 * 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:
  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-17 12:56  dmthinker  阅读(114)  评论(0)    收藏  举报