2025/3/9【栈与队列】LeetCode239.滑动窗口最大值 【🌟】 知识点:单调队列

239. 滑动窗口最大值 - 力扣(LeetCode)

代码随想录

单调队列是一种特殊的队列数据结构,主要用于解决滑动窗口类问题。它的特点是队列中的元素始终保持单调递增或单调递减的顺序。

 核心特点
1. 单调性:队列中的元素按单调递增或递减排列。
2. 动态维护:在插入新元素时,会移除破坏单调性的旧元素。

 操作
- 入队:新元素入队时,移除队尾比它大(递增队列)或小(递减队列)的元素,以保持单调性。
- 出队:移除队首元素,通常用于滑动窗口移动时删除窗口外的元素。

 应用场景
- 滑动窗口最大值/最小值:快速找到窗口内的最大或最小值。
- 优化动态规划:减少状态转移的时间复杂度。

 总结
单调队列通过维护单调性,能够高效解决滑动窗口中的极值问题,时间复杂度通常为O(n)。

方法1:直接用单调队列

from collections import deque
class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        res = []
        mydeque = deque()
        for i in range(len(nums)):
            self.update_mydeque(mydeque, nums[i])

            if i >= k and nums[i-k] == mydeque[0]:
                mydeque.popleft()
            
            if i >= k-1:
                res.append(mydeque[0])
        
        return res

    def update_mydeque(mydeque, num):
        while mydeque and num > mydeque[-1]:
            mydeque.pop()

        mydeque.append(num)

        

方法2:使用自定义的单调队列类

from collections import deque
class Mydeque:
    def __init__(self):
        self.queue = 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]:
        res = []
        que = Mydeque()
        for i in range(k):
            que.push(nums[i])
        res.append(que.front())

        for i in range(k, len(nums)):
            que.pop(nums[i-k])
            que.push(nums[i])
            res.append(que.front())
        
        return res

自己用队列做的,超时间了。

posted @ 2025-03-09 15:44  axuu  阅读(12)  评论(0)    收藏  举报