给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
python
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
length= len(nums)
if length == 0: return []
elif length < k: return [max(nums)]
else:
from collections import deque
q = deque()
res=[]
for id,num in enumerate(nums):
#当队列不为空,且队首元素已不在窗口内时,将队首元素弹出
while q and q[0] <= id-k:
q.popleft()
#当队列不为空,且当前元素大于队尾元素时,将队尾元素弹出
while q and nums[q[-1]] < num:
q.pop()
#将当前元素入队
q.append(id)
if id >= k-1:
res.append(nums[q[0]])
return res
暴力法非常简单,但是在应对大数据的时候时间超时;
维护一个双端队列,数值从大到小,并且队列里的值存放的是数值的数组下标,而不是数值本身。
队首元素保证是最大元素,也就是说只要队首元素在滑动窗口内,就是最大值。而当不在时,就可以直接弹出,存放到结果集。
而在队尾加入元素时,要保证加入的元素不能比滑动窗口已有的元素大,也就是在加入之前,弹出那些比自己小的元素。