请定义一个队列并实现函数 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]
限制:
1 <= push_back,pop_front,max_value的总操作数 <= 10000
1 <= value <= 10^5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class MaxQueue:
#利用max函数找最大值,不太符合O(1)的要求
def __init__(self):
self.queue = []
self.max_num = 0
def max_value(self) -> int:
if self.queue == []:
return -1
else:
return self.max_num
def push_back(self, value: int) -> None:
if value>self.max_num:
self.max_num = value
self.queue.append(value)
def pop_front(self) -> int:
if self.queue == []:
return -1
else:
return self.queue.pop(0)
import queue
class MaxQueue:
def __init__(self):
#添加deque双端队列作为递减数列
self.deque = queue.deque()
self.queue = queue.Queue()
def max_value(self) -> int:
return self.deque[0] if self.deque else -1
def push_back(self, value: int) -> None:
#将新加入的value从双端队列deque的尾部开始比较,比value小的全部pop
#由于queue是队列。只能先进先出,所以将deque中小的pop不会影响
#queue在pop时如果是最大值(deque[0]) ,会将deque[0]踢出
#eg1: push:1->max=1,deque:1,queue:1 // push:2->max=2,deque:2 , queue:1,2 //
# pop=1 -> max=2,deque:2,queue:2
#eg2:push:2->max=2,deque:2,queue:2 // push:1->max=2,deque:2,1 , queue:2,1 //
# pop=2 -> max=1,deque:1,queue:1
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:
return -1
ans = self.queue.get()
if ans == self.deque[0]:
self.deque.popleft()
return ans
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-ii-dui-lie-de-zui-da-zhi-by-leetcod/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
# Your MaxQueue object will be instantiated and called as such:
# obj = MaxQueue()
# param_1 = obj.max_value()
# obj.push_back(value)
# param_3 = obj.pop_front()