单调队列
单调队列就是队列内元素值单调递增或者单调递减,在本题中使用单调队列存储当前窗口内单调递减的元素,队头是窗口内元素的最大值,队尾是窗口内的尾元素。
单调队列的主要思想是,队列没有必要维护窗口中的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是从小到大的
这样一个数据结构实现如下:
class myQueue:
def pop(value):
pass
def push(value):
pass
def front():
pass
如何实现这样一个单调递增的队列呢?
-
对于
pop
操作,就是当传入元素值等于队首元素的时候,将队首元素抛出,否则不进行任何操作; -
对于
push
操作,当要被push进队列的元素大于队尾的元素时,就将队尾的元素弹出,直到push的元素小于等于队尾的元素; -
对于
front
操作:返回队首元素,即窗口内最大的元素。 -
代码实现:
class MyQueue: def __init__(self): self.queue = collections.deque() def pop(value): if self.queue and value == self.queue[0]: self.queue.popleft() def push(value): while self.queue and value > self.queue[-1]: self.queue.pop() self.queue.append(value) def front(): return self.queue[0]
代码实现
class MyQueue:
def __init__(self):
self.queue = collections.deque()
def pop(self,value):
if self.queue and value == self.queue[0]:
self.queue.popleft()
def push(self, value):
while self.queue and value > self.queue[-1]:
self.queue.pop()
self.queue.append(value)
def front(self):
return self.queue[0]
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
queue = MyQueue()
res = []
for i in range(k):
queue.push(nums[i])
res.append(queue.front())
for i in range(k, len(nums)):
queue.pop(nums[i-k])
queue.push(nums[i])
res.append(queue.front())
return res