253. 会议室 II

描述

给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。

示例 1:
输入: [[0, 30],[5, 10],[15, 20]]
输出: 2

示例 2:
输入: [[7,10],[2,4]]
输出: 1

思路

  • 方法1:优先队列--最小堆
    1.按照会议开始时间进行排序;
    2.遍历会议建立会议结束时间的最小堆,如果当前会议开始时间大于堆顶会议结束时间,则将堆顶会议去除,更新当前会议;
class Solution {
public:
    static bool cmp(vector<int> a, vector<int> b){
        return a[0]<b[0];
    }
    int minMeetingRooms(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        priority_queue<int, vector<int>, greater<int>> heap;
        for(auto iter:intervals){
            if(!heap.empty()&&heap.top()<=iter[0]){
                heap.pop();
            }
            heap.push(iter[1]);
        }
        return heap.size();
    }
};
  • 方法2:双指针法
    1.分离会议开始时间与结束时间,升序排序
    2.双指针遍历开始时间与结束时间,当开始时间大于等于结束时间时,房间数不变,结束时间指针+1
class Solution {
public:
    int minMeetingRooms(vector<vector<int>>& intervals) {
        int count=0;
        vector<int> start,end;
        for(auto i:intervals){
            start.push_back(i[0]);
            end.push_back(i[1]);
        }
        sort(start.begin(),start.end(),less<int>());
        sort(end.begin(),end.end(),less<int>());
        auto i=start.begin(),j=end.begin();
        while(i!=start.end()&&j!=end.end()){
            if(*i>=*j){
                count--;
                j++;
            }
            count++;
            i++;
        }
        return count;
    }
};
原文地址:https://www.cnblogs.com/hunter-w/p/12681171.html