版权声明:Za七杂⑧ https://blog.csdn.net/weixin_35085773/article/details/86656313
题目描述:给出一个数组以及大小为k的滑动窗口,返回每个窗口中的最大值。
题目链接:Leetcode 239. Sliding Window Maximum
最简单的思路就是遍历然后用max
函数返回最大值,但是这样的话每次都要遍历一次来找最大值。如果是笔试遇到可以这样做,如果是面试过程中就就应该提出一些更好的idea比如滑动过程中维护一个有序的窗口,画一格,加入的和退出的值。
大概思路是用双向队列保存数字的下标,遍历整个数组,如果此时队列的首元素是i - k的话,表示此时窗口向右移了一步,则移除队首元素。然后比较队尾元素和将要进来的值,如果小的话就都移除,然后此时我们把队首元素加入结果中即可。(这样队首永远是最大的,队尾不断加入,判断元素是否在窗口外、移动窗口达到窗口值时不断入结果)
代码如下
class Solution:
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
queue = []
ans = []
for idx in range(len(nums)):
if (queue and queue[0] == idx-k): queue.pop(0) #the element should be out
while(queue and nums[queue[-1]] < nums[idx]): queue.pop() #pop
queue.append(idx)
if (idx >= k-1): ans.append(nums[queue[0]])
return ans