-lcoftopic请定义一个队列,实现函数max_value,获取队列中的最大值。函数max_value、push_back和pop_front的摊销时间复杂度要求为O(1)。如果队列为空,pop_front和max_value需要返回-1示例1:输入:["MaxQueue","push_back","push_back","max_value","pop_front","max_value"][[],[1],[2],[],[],[]]输出:[null,null,null,2,1,2]示例2:输入:["MaxQueue","pop_front","max_value"][[],[],[]]输出:[null,-1,-1]解题思路:辅助队列原始队列:只记录原始元素;辅助队列:在原队列的基础上进行处理,保证第一个元素为最大值(如果队列不为空)。向原队列添加元素不做判断。当要添加元素时,可以直接添加。主要是维护辅助队列的顺序,保证第一个元素是最大值。具体思路如下:当队列不为空,且最后一个元素小于要加入的元素时,弹出最后一个元素,直到队列为空,或者最后一个元素大于要加入的元素.当原队列弹出第一个元素时,辅助队列也要根据情况进行调整。否则,当原队列的弹出元素与辅助队列的第一个元素相同,但该元素仍然存在于辅助队列中时,这将导致取最大值时出错。解决方法:当原队列弹出一个元素时,判断是否与辅助队列的第一个元素相同。如果相同,辅助队列也会弹出这个元素。引入deque的原因:因为普通list的pop(0)方法弹出第一个元素,时间复杂度为O(n),不符合题目要求,而popleft()方法的时间复杂度为双端队列是O(1)。List和deque弹出第一个元素,时间复杂度如下:图解代码实现classMaxQueue:def__init__(self):#importdeque#因为原list的pop(n)的复杂度是O(n)#而deque的popleft()的复杂度是O(1)fromcollectionsimportdequeself.queue=deque()self.aux_queue=deque()defmax_value(self)->int:#当辅助队列不为空时,返回第一个Element#否则return-1returnself.aux_queue[0]ifself.aux_queueelse-1defpush_back(self,value:int)->None:#将元素放入队列,原队列没有做判断,直接放就行但是self.queue.append(value)#因为辅助队列的第一个元素一定是最大值#所以当辅助队列不为空,且尾部元素小于添加元素,弹出结束元素#直到队列为空,或者结束元素大于要添加的元素,而self.aux_queue和self.aux_queue[-1]
