【数据结构-堆】【哈希+最小堆】力扣1942. 最小未被占据椅子的编号 ...

打印 上一主题 下一主题

主题 1629|帖子 1629|积分 4887

有 n 个朋侪在举办一个派对,这些朋侪从 0 到 n - 1 编号。派对里有 无数 张椅子,编号为 0 到 infinity 。当一个朋侪到达派对时,他会占据 编号最小 且未被占据的椅子。
比方说,当一个朋侪到达时,如果椅子 0 ,1 和 5 被占据了,那么他会占据 2 号椅子。
当一个朋侪离开派对时,他的椅子会立刻酿成未占据状态。如果同一时刻有另一个朋侪到达,可以立刻占据这张椅子。
给你一个下标从 0 开始的二维整数数组 times ,其中 times = [arrivali, leavingi] 表示第 i 个朋侪到达和离开的时刻,同时给你一个整数 targetFriend 。全部到达时间 互不相同 。
请你返回编号为 targetFriend 的朋侪占据的 椅子编号 。
示例 1:
输入:times = [[1,4],[2,3],[4,6]], targetFriend = 1
输出:1
表明:


  • 朋侪 0 时刻 1 到达,占据椅子 0 。
  • 朋侪 1 时刻 2 到达,占据椅子 1 。
  • 朋侪 1 时刻 3 离开,椅子 1 酿成未占据。
  • 朋侪 0 时刻 4 离开,椅子 0 酿成未占据。
  • 朋侪 2 时刻 4 到达,占据椅子 0 。
    朋侪 1 占据椅子 1 ,所以返回 1 。
示例 2:
输入:times = [[3,10],[1,5],[2,6]], targetFriend = 0
输出:2
表明:


  • 朋侪 1 时刻 1 到达,占据椅子 0 。
  • 朋侪 2 时刻 2 到达,占据椅子 1 。
  • 朋侪 0 时刻 3 到达,占据椅子 2 。
  • 朋侪 1 时刻 5 离开,椅子 0 酿成未占据。
  • 朋侪 2 时刻 6 离开,椅子 1 酿成未占据。
  • 朋侪 0 时刻 10 离开,椅子 2 酿成未占据。
    朋侪 0 占据椅子 2 ,所以返回 2 。

最小堆+哈希表
  1. class Solution {
  2. public:
  3.     int smallestChair(vector<vector<int>>& times, int targetFriend) {
  4.         int n = times.size();
  5.         vector<pair<int, int>> arrival;
  6.         vector<pair<int, int>> leaving;
  7.         for(int i = 0; i < n; i++){
  8.             arrival.emplace_back(times[i][0], i);
  9.             leaving.emplace_back(times[i][1], i);
  10.         }
  11.         sort(arrival.begin(), arrival.end());
  12.         sort(leaving.begin(), leaving.end());
  13.         priority_queue<int, vector<int>, greater<int>> q;
  14.         unordered_map<int, int> seats;
  15.         for(int i = 0; i < n; i++){
  16.             q.push(i);
  17.         }
  18.         int j = 0;
  19.         for(auto&& [time, person] : arrival){
  20.             while(j < n && leaving[j].first <= time){
  21.                 q.push(seats[leaving[j].second]);
  22.                 j++;
  23.             }
  24.             int seat = q.top();
  25.             seats[person] = seat;
  26.             q.pop();
  27.             if(person == targetFriend){
  28.                 return seat;
  29.             }
  30.         }
  31.         return -1;
  32.     }
  33. };
复制代码
解决这道题目的关键是我们将到达时间和离开时间举行拆分,然后分别储存到两个容器中,对其举行排序。
题解中,首先我们先定义两个数组arrival和leaving来存储到达时间和离开时间及对应的人的序号,然后将两个数组都举行升序排序。接着我们定义一个最小堆q,来表示没有被占的座位,并按照编号从小到大排序。并且定义一个哈希表seats来储存哪个人占了哪个座位。
我们遍历arrival,也就是到达时间,然后我们在处理到达之前,需要先对离开的人举行处理,我们定义一个指针j,全部离开时间小于到达时间的座位都应该被开释,所以我们要将占据的座位加入到q中供arrival选择。接着我们找到q的队头,我们这时候arrival的人就坐到q.top()的位置,并且记录到seats中,然后弹出q的队头表示已被占用。
当person为targetFriend的时候,那么此时他的座位seat就返回。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表