当前位置: 首页 > 后端技术 > Python

LeetCode面试题59-II.队列的最大值

时间:2023-03-26 15:36:39 Python

-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]int:#队列为空返回-1ifnotself.queue:return-1#弹出第一个加入的元素res=self.queue.popleft()#辅助队列也要注意,#当原来从初始队列弹出的元素恰好是辅助队列的第一个元素#这里辅助队列也需要弹出元素ifres==self.aux_queue[0]:self.aux_queue.popleft()returnres#你的MaxQueue对象会被实例化并这样调用:#obj=MaxQueue()#param_1=obj.max_value()#obj.push_back(value)#param_3=obj.pop_front()实现效果上面是使用辅助队列,结合collections.deque库,解决《面试题59 - II.队列的最大值》请微信关注问题主要内容公众号《书所集录》