2025/3/9【栈与队列】LeetCode239.滑动窗口最大值 【🌟】 知识点:单调队列
单调队列是一种特殊的队列数据结构,主要用于解决滑动窗口类问题。它的特点是队列中的元素始终保持单调递增或单调递减的顺序。
核心特点
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
自己用队列做的,超时间了。