引言
- 简述单调队列与滑动窗口问题的背景及重要性
- 应用场景:动态规划、数据流处理、实时统计等
- 核心目标:高效维护窗口内极值或满足特定条件的数据
单调队列基础
- 定义与特性:队列元素保持单调递增或递减
- 操作原理:入队时维护单调性,出队时移除无效元素
- 时间复杂度分析:均摊O(1)的插入与删除
滑动窗口问题模型
- 问题描述:固定或可变大小的窗口在序列上滑动
- 关键需求:快速获取窗口内最大值/最小值或其他统计量
- 暴力解法缺陷:O(nk)时间复杂度不适用于大规模数据
单调队列的优化实现
- 维护单调队列的具体步骤
- 队首处理:过期元素出队
- 队尾处理:破坏单调性的元素被移除
- 代码模板示例(以最大值为例):
def maxSlidingWindow(nums, k): from collections import deque q = deque() res = [] for i, num in enumerate(nums): while q and nums[q[-1]] <= num: q.pop() q.append(i) if q[0] == i - k: q.popleft() if i >= k - 1: res.append(nums[q[0]]) return res
典型例题解析
- 例题1:滑动窗口最大值(LeetCode 239)
- 问题重述与输入输出示例
- 单调队列解法详细推导
- 例题2:满足条件的子数组数目
- 转化为单调队列维护的统计问题
- 双指针与单调队列的结合使用