【Leetcode】239. 滑动窗口最大值

博客介绍了单调队列,即队列内元素值单调递增或递减,本题用其存储当前窗口内单调递减元素,队头为窗口最大值。阐述了单调队列主要思想,还说明了实现单调递增队列的操作,最后提及了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单调队列

单调队列就是队列内元素值单调递增或者单调递减,在本题中使用单调队列存储当前窗口内单调递减的元素,队头是窗口内元素的最大值,队尾是窗口内的尾元素。

单调队列的主要思想是,队列没有必要维护窗口中的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是从小到大的

这样一个数据结构实现如下:

class myQueue:
	def pop(value):
		pass
	def push(value):
		pass
	def front():
		pass

如何实现这样一个单调递增的队列呢?

  1. 对于pop操作,就是当传入元素值等于队首元素的时候,将队首元素抛出,否则不进行任何操作;

  2. 对于push操作,当要被push进队列的元素大于队尾的元素时,就将队尾的元素弹出,直到push的元素小于等于队尾的元素;

  3. 对于front操作:返回队首元素,即窗口内最大的元素。

  4. 代码实现:

    class MyQueue:
    	def __init__(self):
    		self.queue = collections.deque()
    	def pop(value):
    		if self.queue and value == self.queue[0]:
    			self.queue.popleft()
    	def push(value):
    		while self.queue and value > self.queue[-1]:
    			self.queue.pop()
    		self.queue.append(value)
    	def front():
    		return self.queue[0]
    

代码实现

class MyQueue:
    def __init__(self):
        self.queue = collections.deque()
    def pop(self,value):
        if self.queue and value == self.queue[0]:
            self.queue.popleft()
    def push(self, value):
        while self.queue and value > self.queue[-1]:
            self.queue.pop()
        self.queue.append(value)
    def front(self):
        return self.queue[0]

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        queue = MyQueue()
        res = []

        for i in range(k):
            queue.push(nums[i])
        res.append(queue.front())

        for i in range(k, len(nums)):
            queue.pop(nums[i-k])
            queue.push(nums[i])
            res.append(queue.front())
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值