滑动窗口的最大值
About 1 min
滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
输入: 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
nums = [1, 3, -1, -3, 5, 3, 6, 7]
def maxSlidingWindow(nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
def maxSlidingWindow(nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: List[int]
"""
if not nums or k == 0:
return []
que=collections.deque()
n=len(nums)
result=[]
#初始化窗口
for i in range(k):
while que and que[-1]<nums[i]:
que.pop()
que.append(nums[i])
result.append(que[0])
#窗口形成后 保持更新并保证左边为最大值 que按最大值顺序排列
for i in range(k, n):
# 重点 i-k代表当前的窗口左边索引 如果此处和最大值相同则队列移除最大值
if que[0] == nums[i - k]:
que.popleft()
while que and que[-1] < nums[i]: #如果que的末尾一直比后来的值小 则一直pop
que.pop()
que.append(nums[i])
result.append(que[0])
return result
print(maxSlidingWindow(nums,3))
思路: 考虑窗口初始化,窗口形成后的两种状态
队列按顺序存储当前窗口的最大值,左值最大 窗口滑动时, 队列中的最大值是否是滑动窗口左值,如果是,则队列左值出队
如果入队值比队列末尾值大,则队列末尾一直出队,直到入队值入队
时间复杂度 O(n)
空间复杂度 O(k)
暴力解法的时间复杂度为O(nk)