b_lc_最小未被占据椅子的编号(记录每个时间来的人 + pq)

有 n 个人,0 到 n - 1 编号。有 无数 张椅子,编号为 0 到 infinity 。
当一个朋友到达派对时,他会占据 编号最小 且未被占据的椅子。

当一个朋友离开派对时,他的椅子会立刻变成未占据状态。
如果同一时刻有另一个朋友到达,可以立即占据这张椅子。

给你一个下标从 0 开始的二维整数数组 times ,
其中 times[i] = [arrivali, leavingi] 表示第 i 个朋友到达和离开的时刻,
同时给你一个整数 targetFriend 。所有到达时间 互不相同 。

请你返回编号为 targetFriend 的朋友占据的 椅子编号 。
n <= 1e5,times[i][0] <= 1e5

思路:先存储每个时间到来、离去的人的编号。然后在遍历每个时间点之前,我先将所有离去的人的作为先加到队列里面,然后在处理坐下的逻辑,这样会将问题简化到最简单


const int N = 1e5 + 5;
class Solution {
public:
    int smallestChair(vector<vector<int>>& times, int tar) {
        int n = times.size();
        priority_queue<int, vector<int>, greater<int>> free;
        for (int i = 0; i < N; i++) {
            free.push(i);
        }
        vector<vector<int>> came(N), left(N);
        for (int i = 0; i < n; i++) {
            came[times[i][0]].push_back(i);
            left[times[i][1]].push_back(i);
        }

        unordered_map<int, int> mp;
        for (int i = 1; i < N; i++) {
            for (int j : left[i]) {
                free.push(mp[j]);
            }   
            for (int j : came[i]) {
                mp[j] = free.top();
                free.pop();
            }
        }
        return mp[tar];
    }
};
原文地址:https://www.cnblogs.com/wdt1/p/15056806.html