难度:中等
题目内容:
请定义一个队列并实现函数 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
题解:
难度到中等了
如果直接就普通队列的话,可以实现功能,但是这个max_value的时间复杂度就会变成O(n),很难顶,想做成O(1)还得继续想办法
import queue
class MaxQueue:
def __init__(self):
self.deque = queue.deque()
def max_value(self) -> int:
return max(self.deque) if self.deque else -1
def push_back(self, value: int) -> None:
self.deque.append(value)
def pop_front(self) -> int:
return self.deque.popleft() if self.deque else -1
如果直接做个变量的存储的话,每次push或pop的时候更新存储的最大值
push更新比较简单,pop就需要搞到去掉pop的数后的最大值,然而一求最大值就又不是O(1)了。
所以再弄个一个序列去按大小顺序存下队列的数值,每次push和pop虽然要稍微循环一下,但是肯定是小于等于长度n的,多次平均操作也是小于O(n),就视为O(1)
image.png
内存占用还蛮不错,但是时间有点拉垮
代码
import queue
class MaxQueue:
def __init__(self):
self.deque = queue.deque()
self.m = -1
self.templ = []
def max_value(self) -> int:
return max(self.deque) if self.deque else -1
def push_back(self, value: int) -> None:
if len(self.templ)> 0:
if value <= self.templ[0]:
self.templ = [value] + self.templ
elif value >= self.templ[-1]:
self.templ.append(value)
else:
for i in range(len(self.templ)):
if self.templ[i] <= value and self.templ[i+1] >= value:
self.templ.insert(i,value)
break
else:
self.templ.append(value)
self.deque.append(value)
if value > self.m:
self.m = value
def pop_front(self) -> int:
if not self.deque:
self.m = -1
return -1
p = self.deque.popleft()
self.templ.remove(p)
if p > self.m:
self.m = self.templ[-1]
return p
# 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()
官方题解:
再看下官方的题解
思路好像差别不是很大
不过人家写的利索多了
import queue
class MaxQueue:
def __init__(self):
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:
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论