leetcode 最多可以参加的会议数目 中等

 

 

贪心: 对于开始时间相同的会议来说,肯定是先安排结束时间早的。

所以,可以枚举时间点,当某个会议在此时间点开始了,则将其结束时间加入优先队列。

对于优先队列来说,如果结束时间小于当前时间点,那么将其弹出。否则,取 top,安排会议,即 ++ ans;

// 由于需要从小到大排列结束时间,下列 push 结束时间的 相反数。(优先队列默认为大根堆.)

class Solution {
public:
    int maxEvents(const vector<vector<int>>& events) {
        vector<int> begin[maxn];    // i 时间点开始的会议
        for(int i = 0; i < events.size(); ++ i) {
            begin[events[i][0]].emplace_back(events[i][1]);
        }
        priority_queue<int> pque;   // 当前待安排的会议终止时间
        int nowTime = 1, ret = 0;
        while(nowTime < maxn) {
            for(auto &item : begin[nowTime]) pque.push(-item);
            while(!pque.empty()) {
                if(-pque.top() >= nowTime) break;
                pque.pop();
            }
            if(!pque.empty()) {
                ++ ret;
                pque.pop();
            }
            ++ nowTime;
        }
        return ret;
    }

private:
    static const int maxn = 1e5 + 1;
};

 

posted @ 2021-08-31 21:12  rookie_Acmer  阅读(52)  评论(0)    收藏  举报