leetcode Merge Intervals

  1 /*****************************************************************
  2 created:    2014/09/13 21:32
  3 filename:    merge-intervals.cpp
  4 author:        Justme0 (http://blog.csdn.net/justme0)
  5 
  6 purpose:    合并交叉的区间
  7 https://oj.leetcode.com/problems/merge-intervals/
  8 *****************************************************************/
  9 
 10 #define _CRT_SECURE_NO_WARNINGS
 11 #include <iostream>
 12 #include <vector>
 13 #include <algorithm>
 14 #include <cassert>
 15 using namespace std;
 16 
 17 struct Interval {
 18     int start;
 19     int end;
 20 
 21     Interval() : start(0), end(0) {}
 22     Interval(int s, int e) : start(s), end(e) {}
 23 };
 24 
 25 /**
 26  * Definition for an interval.
 27  * struct Interval {
 28  *     int start;
 29  *     int end;
 30  *     Interval() : start(0), end(0) {}
 31  *     Interval(int s, int e) : start(s), end(e) {}
 32  * };
 33  */
 34 class Solution {
 35 public:
 36     vector<Interval> merge(vector<Interval> &intervals) {
 37         if (intervals.empty()) {
 38             return vector<Interval>();
 39         }
 40 
 41         vector<Point> coordinates;
 42         for (auto iter = intervals.begin(); iter != intervals.end(); ++iter) {
 43             coordinates.push_back(Point(iter->start, true));
 44             coordinates.push_back(Point(iter->end, false));
 45         }
 46         sort(coordinates.begin(), coordinates.end(), cmp);
 47 
 48         int depth = 0;    // 覆盖的深度
 49         assert(coordinates.front().isLeft);
 50         vector<Interval> merged_itvs;
 51         int start = 0;
 52         for (auto iter = coordinates.begin(); iter != coordinates.end(); ++iter) {
 53             assert(depth >= 0);
 54             if (0 == depth) {
 55                 start = iter->x;    // 此时“栈空”,iter 指向左端点,开始合并一个区间
 56             }
 57             iter->isLeft ? ++depth : --depth;
 58             if (0 == depth) {
 59                 merged_itvs.push_back(Interval(start, iter->x));    // 此时“栈空”,iter 指向右端点,确定了一个区间
 60             }
 61         }
 62 
 63         return merged_itvs;        // 接口设计得不好
 64     }
 65 
 66     struct Point {
 67         int x;
 68         bool isLeft;
 69 
 70         Point() : x(0), isLeft(false) {}
 71 
 72         Point(int _x, bool _isLeft) : x(_x), isLeft(_isLeft) {}
 73 
 74 //         bool operator<(const Point &other) const {
 75 //             if (this->x < other.x) {
 76 //                 return true;
 77 //             } else if (this->x > other.x) {
 78 //                 return false;
 79 //             } else if (this->isLeft == other.isLeft) {
 80 //                 return this < &other;
 81 //             } else {
 82 //                 return this->isLeft;
 83 //             }
 84 //         }
 85     };
 86 
 87     static bool cmp(const Point &a, const Point &b) {
 88         if (a.x < b.x) {
 89             return true;
 90         } else if (a.x > b.x) {
 91             return false;
 92         } else if (a.isLeft == b.isLeft) {
 93             return false;
 94         } else {
 95             return a.isLeft;
 96         }
 97     }
 98 
 99 };
100 
101 int main(int argc, char **argv) {
102     freopen("cin.txt", "r", stdin);
103 
104     vector<Interval> vec;
105     int a, b;
106     while (cin >> a >> b) {
107         vec.push_back(Interval(a, b));
108     }
109 
110     vector<Interval> ans = Solution().merge(vec);
111     for (auto ite = ans.begin(); ite != ans.end(); ++ite) {
112         cout << ite->start << ' ' << ite->end << endl;
113     }
114 
115     system("PAUSE");
116     return 0;
117 }
原文地址:https://www.cnblogs.com/jjtx/p/3981850.html