253.会议室②

给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。

示例 1:

输入:intervals = [[0,30],[5,10],[15,20]]
输出:2

示例 2:

输入:intervals = [[7,10],[2,4]]
输出:1

解析:首先根据会议开始时间将所有会议进行排序;然后将第一个会议的结束时间作为root值来创建优先队列,后续的会议根据开始时间找堆中的空闲房间:

  • 如果房间的值(结束时间)小于后续会议,则更新其结束时间为新的会议结束时间
  • 如果没有房间的结束时间小于后续会议,则根据后续会议结束时间,插入当前堆

这里无论找没找到可用的房间,最终都要push当前会议时间到堆中,区别在于找到房间的话,要把找到的房间pop出来,用新时间去替代pop掉的房间。

堆排序最上边的值一定是最小的,如果最小的会议结束时间都不满足,那直接拆入新时间就好。

class Solution {
public:
    int minMeetingRooms(vector<vector<int>>& intervals) {
        if (intervals.size() == 0)
            return 0;

        sort(intervals.begin(), intervals.end());

        priority_queue<int, vector<int>, greater<int>> rooms;
        rooms.push(intervals[0][1]);
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] >= rooms.top()) {
                rooms.pop();
            }
            rooms.push(intervals[i][1]);
        }
        return rooms.size();
    }
};

相关:

1、priority_queue

2、堆排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值