每个矩形分为左边和右边两个事件,记下对应高度
对所有事件按照x坐标排序
建立高度最大堆
扫描线
遇到左边事件,堆中加入高度
遇到右边事件,堆中删除高度
堆中最大值为组合图形现在的高度
x坐标事件处理完后,如果新高度不等于原来的高度,出现拐点,记录下来
时间复杂度nlog(n)
c++ multiset
插入删除都是log2n

919. Meeting Rooms II

  1. class Solution {
  2. public:
  3. /**
  4. * @param intervals: an array of meeting time intervals
  5. * @return: the minimum number of conference rooms required
  6. */
  7. int minMeetingRooms(vector<Interval> &intervals) {
  8. // Write your code here
  9. vector <int> start;
  10. vector <int> end;
  11. for (int i = 0; i < intervals.size(); i ++){
  12. start.push_back(intervals[i].start);
  13. end.push_back(intervals[i].end);
  14. }
  15. sort(start.begin(), start.end());
  16. sort(end.begin(), end.end());
  17. int startPointer = 0, endPointer = 0, res = 0, temp = 0;
  18. while (startPointer < start.size() && endPointer < end.size()){
  19. if (end[endPointer] <= start[startPointer]){
  20. endPointer += 1;
  21. temp -= 1;
  22. //cout << res << temp<< endl;
  23. }else{
  24. startPointer += 1;
  25. temp += 1;
  26. res = max(res, temp);
  27. }
  28. }
  29. return res;
  30. }
  31. };

391. Number of Airplanes in the Sky

/**
 * Definition of Interval:
 * classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this->start = start;
 *         this->end = end;
 *     }
 * }
 */
bool Comparator(vector<int> o1, vector<int> o2){
    if (o1[0] == o2[0]){
        return o1[1] < o2[1];
    }
    return o1[0] < o2[0];
}
class Solution {
public:
    /**
     * @param airplanes: An interval array
     * @return: Count of airplanes are in the sky.
     */
    int countOfAirplanes(vector<Interval> &airplanes) {
        // write your code here
        vector<vector<int>> array (airplanes.size() * 2, vector<int>(2));
        int res = 0, temp = 0;
        for (int i = 0; i < airplanes.size(); i ++){
            array[2 * i][0] = airplanes[i].start;
            array[2 * i][1] = 1;
            array[2 * i + 1][0] = airplanes[i].end;
            array[2 * i + 1][1] = 0;
        }
        sort (array.begin(), array.end(), Comparator);
        for (int i = 0; i < array.size(); i ++){
            if (array[i][1] == 1){
                temp += 1;
                res = max(temp, res);
            }else{
                temp --;
            }
        }
        return res;
    }
};