分摊时间复杂度 ,敲黑板!要考的!
一、题目
请定义一个队列并实现函数 max_value
得到队列里的最大值,要求函数 max_value
、 push_back
和 pop_front
的均摊时间复杂度都是 O(1)
。
若队列为空,pop_front
和 max_value
需要返回 -1
示例 1:
1 |
|
示例 2:
1 |
|
限制:
- 1 <= push_back,pop_front,max_value的总操作数 <= 10000
- 1 <= value <= 10^5
二、思路
双端辅助队列
毕竟题目要求说了,时间复杂度为 O(1) 。所以除了用空间换时间,还真想不到什么好办法。
普通队列:就是用来正常存储数据的。
双端队列:是用来存储比较后的数据。也就是说,可以将最大值放置指定的位置,最后调用。那为什么选用双端队列?
根据双端队列的性质,队列的两端都可以执行入队和出队的操作。我们在将数据入队同时,还可以将数据与已入队的数据比较。
如果数据值小时,则直接入队。如果数据值大时,且队列不为空,则将除队头元素外的元素挨个出栈,直到队列为空时,重新入队。如图:
三、代码实现
1 |
|