-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSolution239_maxSlidingWindow.py
51 lines (30 loc) · 1.54 KB
/
Solution239_maxSlidingWindow.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class MyQueue: # 单调队列(从大到小)
def __init__(self):
self.queue = [] # 使用list来实现单调队列
# 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
# 同时pop之前判断队列当前是否为空。
def pop(self, value):
if self.queue and value == self.queue[0]:
self.queue.pop(0) # list.pop()时间复杂度为O(n),这里可以使用collections.deque()
# 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
# 这样就保持了队列里的数值是单调从大到小的了。
def push(self, value):
while self.queue and value > self.queue[-1]:
self.queue.pop()
self.queue.append(value)
# 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
def front(self):
return self.queue[0]
class Solution:
def maxSlidingWindow(self, nums, k):
que = MyQueue()
result = []
# 先将最前面的k个元素加入队列
for i in range(k):
que.push(nums[i])
result.append(que.front()) # 记录前k个元素的最大值
for i in range(k, len(nums)):
que.pop(nums[i - k]) # 滑动窗口移除最前面素
que.push(nums[i]) # 滑动窗口前 加入最后面的元素
result.append(que.front()) # 记录对应的最大值
return result