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

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

比方说,当一个朋友到达时,如果椅子 0 ,1 和 5 被占据了,那么他会占据 2 号椅子。

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

给你一个下标从 0 开始的二维整数数组 times ,其中 timesi = 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 。

最小堆+哈希表

csharp 复制代码
class Solution {
public:
    int smallestChair(vector<vector<int>>& times, int targetFriend) {
        int n = times.size();
        vector<pair<int, int>> arrival;
        vector<pair<int, int>> leaving;
        for(int i = 0; i < n; i++){
            arrival.emplace_back(times[i][0], i);
            leaving.emplace_back(times[i][1], i);
        }

        sort(arrival.begin(), arrival.end());
        sort(leaving.begin(), leaving.end());

        priority_queue<int, vector<int>, greater<int>> q;
        unordered_map<int, int> seats;
        for(int i = 0; i < n; i++){
            q.push(i);
        }

        int j = 0;
        for(auto&& [time, person] : arrival){
            while(j < n && leaving[j].first <= time){
                q.push(seats[leaving[j].second]);
                j++;
            }

            int seat = q.top();
            seats[person] = seat;
            q.pop();
            if(person == targetFriend){
                return seat;
            }
        }
        return -1;
    }
};

解决这道题目的关键是我们将到达时间和离开时间进行拆分,然后分别储存到两个容器中,对其进行排序。

题解中,首先我们先定义两个数组arrival和leaving来存储到达时间和离开时间及对应的人的序号,然后将两个数组都进行升序排序。接着我们定义一个最小堆q,来表示没有被占的座位,并按照编号从小到大排序。并且定义一个哈希表seats来储存哪个人占了哪个座位。

我们遍历arrival,也就是到达时间,然后我们在处理到达之前,需要先对离开的人进行处理,我们定义一个指针j,所有离开时间小于到达时间的座位都应该被释放,所以我们要将占据的座位加入到q中供arrival选择。接着我们找到q的队头,我们这时候arrival的人就坐到q.top()的位置,并且记录到seats中,然后弹出q的队头表示已被占用。

当person为targetFriend的时候,那么此时他的座位seat就返回。

相关推荐
To_OC1 小时前
LC 131 分割回文串:刚学回溯时,我连怎么切字符串都想不明白
javascript·算法·leetcode
旖-旎2 小时前
LeetCode 518:零钱兑换||(完全背包)—— 题解
c++·算法·leetcode·动态规划·背包问题
To_OC3 小时前
LC 42 接雨水:暴力超时卡半天?前后缀数组一用就通了
javascript·算法·leetcode
延凡科技7 小时前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
皓月斯语12 小时前
B3842 [GESP202306 三级] 春游 题解
数据结构·c++·算法·题解
春日见13 小时前
算法与数据结构----哈希表
数据结构·人工智能·算法·机器学习·自动驾驶·哈希算法·散列表
萌动的小火苗13 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
叩码以求索13 小时前
统计按位或能得到最大值的子集数目(一)
数据结构·算法
tachibana214 小时前
hot100 数组中的第K个最大元素(215)
java·数据结构·算法·leetcode
星恒随风14 小时前
C++ STL 栈详解:stack 的使用、经典题目与简单模拟实现
开发语言·数据结构·c++·笔记·学习