5 solutions
-
0
题面描述
塔子哥需要管理 个通道,当用户输入 时,将分配一个未被使用的最小通道编号;若输入有效通道编号,则回收该通道。你需要计算经过若干操作后,下一次申请时可以获得的通道编号,若无可用通道则返回 。输入包括操作次数 和 个操作数,输出为下一个可用的通道编号。
思路:模拟/小根堆
我们可以把set当作小根堆来使用,用来模拟这个问题,首先把个通道编号全部按顺序入队(通道编号下标从0开始),这样队头元素就是编号最小的通道
- 用户输出-1,直接弹出队头元素(取出set的开头元素)
- 用户输出为,把直接放进去set即可 最终输出的结果即为set的队头元素 上述模拟的过程,是使用set集合的思想,也可以直接使用优先队列,优先队列是小根堆,这样堆顶就是编号最小的通道
解决思路
-
初始化:
- 使用一个
set
(集合)来存储所有可用的通道编号,初始化时将 到 的所有编号插入集合中。由于集合会自动保持元素的有序性,集合的头元素即为当前最小的空闲通道编号。
- 使用一个
-
处理用户输入:
- 当用户输入
-1
时,表示需要分配一个通道编号,我们从集合中取出并删除最小的元素。 - 当用户输入一个有效的通道编号
x
时,表示释放该通道编号,我们将其添加回集合中。
- 当用户输入
-
输出结果:
- 在所有操作完成后,如果集合中仍有元素,输出集合的头元素(即最小的可用通道编号);如果集合为空,输出
-1
。
- 在所有操作完成后,如果集合中仍有元素,输出集合的头元素(即最小的可用通道编号);如果集合为空,输出
复杂度分析
-
时间复杂度:
- 插入和删除操作的时间复杂度均为 ,其中 是当前集合中的元素个数。
- 在最坏情况下(每次操作都为
-1
),集合的操作会进行 次,因此总体复杂度为 ,其中 最多为 。
-
空间复杂度:
- 需要额外的空间存储集合,最坏情况下需要存储 个通道编号,因此空间复杂度为 。
时间复杂度
代码
C++
python代码
Java代码
- 1
Information
- ID
- 69
- Time
- 2000ms
- Memory
- 256MiB
- Difficulty
- 4
- Tags
- # Submissions
- 216
- Accepted
- 80
- Uploaded By