难度困难1533收藏分享切换为英文接收动态反馈
给你一个整数数组 nums
,有一个大小为 k
的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k
个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1:
输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 7 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3 5] 3 6 7 5 1 3 -1 [-3 5 3] 6 7 5 1 3 -1 -3 [5 3 6] 7 6 1 3 -1 -3 5 [3 6 7] 7
示例 2:
输入:nums = [1], k = 1 输出:[1]
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
1 <= k <= nums.length
根据题目当中,列表中的数据左出右进,向右不断平移,本体思路考虑用单调队列结构来写。
deque内的元素非严格意义上的递减 ,res用于存储每一次的移动后窗口中的最大值。初始时,右指针位于0,也就是最左端,然后开始向右平移,一直平移k次后出现第一个窗口。
因为窗口移动的时候每次都会从左边出去一个元素,右边进一个,所以我们队列deque中的数据也要跟着往外出。
当队列中的元素小于下一个要进入的元素时就将其所有元素出队,所以队列里最左端一直存着该窗口的最大值,最后我们将最大值加入res当中
class Solution(object):
def maxSlidingWindow(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
n=len(nums)
res=[]
deque=collections.deque()
for i,j in zip(range(1-k,n-k+1),range(n)):
if i>0 and deque[0]==nums[i-1]:
deque.popleft()
while deque and deque[-1]<nums[j]:
deque.pop()
deque.append(nums[j])
if i>=0:
res.append(deque[0])
return res