单调队列:高效解决滑动窗口极值

单调队列的概念

单调队列是一种特殊的队列数据结构,其元素按照一定的单调性(递增或递减)排列。它主要用于维护滑动窗口内的极值(最大值或最小值),时间复杂度通常为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)。

通过合理使用单调队列,可以高效解决滑动窗口类问题,显著降低算法复杂度。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值