滑动窗口最大值,单调队列问题
程序员文章站
2024-02-21 14:19:10
...
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位,返回滑动窗口中的最大值
class Solution(object):
def maxSlidingWindow(self, nums, k):
res=[]
window=[]
if not nums or not k: #如果都为空
return res
for i in range(len(nums)):
if (i<k-1): #这个地方先填充k-1个元素
self.push(window,nums[i])
else:
self.push(window,nums[i]) #填充第三个元素时 开始比较 并且启动单调队列
res.append(self.getmax(window))
self.remove(window,nums[i-k+1])
return res
def push(self,data,n):
while(data and data[-1]<n):
data.pop() #删除前n 个比填入数字小的数组 当前只保存最大的值
data.append(n)
def getmax(self,data):
return data[0]
def remove(self,data,n):
if (data and data[0]==n): #n=nums[i-k+1],即队首元素
#n表示滑到的队尾元素所对应的队首元素,如果还是最大的,则pop出去,
#因为下一个push的元素比较的时候,不能再看这个元素了,这是上个窗口的最大值
data.pop(0)