有 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];
}
};