题目描述:
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
进阶:
你能在线性时间复杂度内解决此题吗?
最简单的暴力法:
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
res=[]
for i in range(len(nums)-k+1):
res.append(max(nums[i:i+k]))
return res
时间复杂度较差:
根据题解思路的双向队列解法:
from collections import deque
class Solution:
def maxSlidingWindow(self, nums: 'List[int]', k: 'int') -> 'List[int]':
n = len(nums)
if n * k == 0:
return []
if k == 1:
return nums
def clean_deque(i):
if deq and deq[0] == i - k:
deq.popleft()
while deq and nums[i] > nums[deq[-1]]:
deq.pop()
deq = deque()
max_idx = 0
for i in range(k):
clean_deque(i)
deq.append(i)
if nums[i] > nums[max_idx]:
max_idx = i
output = [nums[max_idx]]
for i in range(k, n):
clean_deque(i)
deq.append(i)
output.append(nums[deq[0]])
return output