单调队列的概念
单调队列是一种特殊的队列数据结构,其元素按照一定的单调性(递增或递减)排列。它主要用于维护滑动窗口内的极值(最大值或最小值),时间复杂度通常为O(n),相比暴力解法有显著优化。
单调队列的基本操作
单调队列的核心操作包括入队和出队,确保队列始终满足单调性:
- 入队操作:新元素入队时,从队尾开始移除破坏单调性的元素,再将其加入队尾。
- 出队操作:若队首元素超出滑动窗口范围,则将其移除。
单调队列的实现示例
以维护滑动窗口最大值为例,以下是Python实现代码:
from collections import deque
def maxSlidingWindow(nums, k):
dq = deque()
result = []
for i in range(len(nums)):
# 移除队首超出窗口范围的元素
while dq and dq[0] < i - k + 1:
dq.popleft()
# 移除队尾小于当前元素的元素
while dq and nums[dq[-1]] < nums[i]:
dq.pop()
dq.append(i)
if i >= k - 1:
result.append(nums[dq[0]])
return result
单调队列的应用场景
单调队列常用于解决以下问题:
- 滑动窗口最大值/最小值。
- 区间最值查询优化。
- 动态规划中的状态转移优化。
单调队列与优先队列的区别
- 单调队列:通过严格维护单调性,保证队首元素为当前窗口的最值,时间复杂度均摊O(1)。
- 优先队列:基于堆实现,获取最值的时间复杂度为O(logn),但无法高效处理滑动窗口问题。
复杂度分析
- 时间复杂度:每个元素最多入队和出队一次,整体复杂度为O(n)。
- 空间复杂度:队列最多存储k个元素,复杂度为O(k)。
通过合理使用单调队列,可以高效解决滑动窗口类问题,显著降低算法复杂度。
342

被折叠的 条评论
为什么被折叠?



