LCR 184. 设计自助结算系统
大约 1 分钟
---
LCR 184. 设计自助结算系统
- 标签:设计、队列、单调队列
- 难度:中等
题目链接
题目大意
要求:设计一个「队列」,实现 max_value 函数,可通过 max_value 得到大年队列的最大值。并且要求 max_value、push_back、pop_front 的均摊时间复杂度都是 O(1)。
解题思路
利用空间换时间,使用两个队列。其中一个为原始队列 queue,另一个为递减队列 deque,deque 用来保存队列的最大值,具体做法如下:
push_back操作:如果deque队尾元素小于即将入队的元素value,则将小于value的元素全部出队,再将valuew入队。否则直接将value直接入队,这样deque队首元素保存的就是队列的最大值。pop_front操作:先判断deque、queue是否为空,如果deque或者queue为空,则说明队列为空,直接返回-1。如果都不为空,从queue中取出一个元素,并跟deque队首元素进行比较,如果两者相等则需要将deque队首元素弹出。max_value操作:如果deque不为空,则返回deque队首元素。否则返回-1。
代码
import collections
import queue
class MaxQueue:
def __init__(self):
self.queue = queue.Queue()
self.deque = collections.deque()
def max_value(self) -> int:
if self.deque:
return self.deque[0]
else:
return -1
def push_back(self, value: int) -> None:
while self.deque and self.deque[-1] < value:
self.deque.pop()
self.deque.append(value)
self.queue.put(value)
def pop_front(self) -> int:
if not self.deque or not self.queue:
return -1
ans = self.queue.get()
if ans == self.deque[0]:
self.deque.popleft()
return ans