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 a, vector b){
        return a[0]>& intervals) {
        sort(intervals.begin(),intervals.end(),cmp);
        priority_queue, greater> 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>& intervals) {
        int count=0;
        vector start,end;
        for(auto i:intervals){
            start.push_back(i[0]);
            end.push_back(i[1]);
        }
        sort(start.begin(),start.end(),less());
        sort(end.begin(),end.end(),less());
        auto i=start.begin(),j=end.begin();
        while(i!=start.end()&&j!=end.end()){
            if(*i>=*j){
                count--;
                j++;
            }
            count++;
            i++;
        }
        return count;
    }
};

你可能感兴趣的:(253. 会议室 II)