跳转至

单调队列

约 170 个字 12 行代码 预计阅读时间 1 分钟

O(n) 解决滑动窗口类问题,即序列中每个长度m的区间最值

维护一个双向队列deque,表示可能是区间最值的元素

遍历序列,当新旧元素序号之差大于等于m,说明新旧元素不在一个长度m的区间,旧元素出队

当新元素大于旧元素,说明旧元素永远不可能成为区间最值,旧元素出队

根据上面操作过程,显然队列内元素单调递减

组的题里有专门考单调队列的,但是区域赛真题大多是用单调队列优化DP的

deque<int> q;
int a[N];
for (int i = 0; i < n; ++i)
{
    if (!q.empty() && i - q.front() >= m)
        q.pop_front();
    while (!q.empty() && a[q.back()] < a[i])
        q.pop_back();
    q.push_back(i);
    if (i >= m - 1)
        cout << a[q.front()] << " ";
}