python滑动窗口最大值
时间: 2023-08-29 21:07:15 浏览: 156
可以使用双端队列来实现滑动窗口最大值的查找,具体步骤如下:
1. 创建一个双端队列,用于保存滑动窗口中的元素下标,队列中的元素按照从大到小的顺序排列。
2. 遍历整个数组,对于每个元素,进行以下操作:
a. 如果队列非空且队列中第一个元素的下标小于等于当前元素下标与窗口大小之差,说明队列中第一个元素已经不在窗口中了,将其从队列中删除。
b. 将当前元素下标加入队列中。
c. 如果队列中最后一个元素的下标小于等于当前元素下标,说明队列中最后一个元素不可能成为窗口内的最大值,将其从队列中删除。
d. 如果当前元素下标大于等于窗口大小减1,说明已经形成了一个完整的窗口,将队列中第一个元素对应的元素作为当前窗口的最大值。
代码实现如下:
```python
from collections import deque
def max_sliding_window(nums, k):
n = len(nums)
if not nums or k <= 0 or k > n:
return []
# 初始化双端队列,保存的是元素下标
q = deque()
res = []
for i in range(n):
# 如果队列非空且队列中第一个元素的下标小于等于当前元素下标与窗口大小之差,说明队列中第一个元素已经不在窗口中了,将其从队列中删除。
if q and q[0] <= i - k:
q.popleft()
# 将当前元素下标加入队列中。
while q and nums[q[-1]] < nums[i]:
q.pop()
q.append(i)
# 如果当前元素下标大于等于窗口大小减1,说明已经形成了一个完整的窗口,将队列中第一个元素对应的元素作为当前窗口的最大值。
if i >= k - 1:
res.append(nums[q[0]])
return res
```
例如,对于数组 `[1,3,-1,-3,5,3,6,7]`,窗口大小为 3,滑动窗口最大值为 `[3,3,5,5,6,7]`。
阅读全文