Leetcode239. Sliding Window Maximum
Leetcode239. Sliding Window Maximum
题目
思路
1.暴力循环,对每个窗口内比较最大值
2.使用双端队列,从前到后,将数值压入队列中,将队列中比它小的值都弹出
复杂度
暴力循环的时间复杂度是 O ( n ∗ k ) O(n*k) O(n∗k)
使用栈:
时间复杂度,从前到后遍历一次即完成操作,因此为 O ( n ) O(n) O(n)
空间复杂度,新建了队列,最坏情况是满队列, O ( n ) O(n) O(n)
代码
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
begin = 0
q = collections.deque([], maxlen=k)
output = []
for end in range(len(nums)):
# 保证最左侧的元素是队列中的最大数(下标)
while q and nums[end] > nums[q[-1]]:
q.pop()
q.append(end)
# 只保留在当前窗口中的元素下标
while end - begin + 1 > k:
begin +=1
if q[0] < begin:
q.popleft()
if end - begin + 1 == k:
output.append(nums[q[0]])
return output