Skip to content

单调队列

一个可以操作头和尾,且内部元素单调的数据结构。可以用STL中的deque实现。

例题: 求长度为n的数组中,每连续m个元素的最小值。

C++代码:

cpp
deque<int> dq;
for(int i = 0; i < m; i++) {
    // 若第i个数比队列尾的数小,弹出队列尾的数。
    while (dq.size() && a[i] < a[dq.back()]) {
        dq.pop_back();
    }
    dq.push_back(i);
}
cout << a[dq.front()] << " ";
for(int i = m; i < n; i++) {
    // 弹出已经在长度为m的子区间外的数
    while (dq.size() && i - dq.front() >= m) {
        dq.pop_front();
    }
    // 若第i个数比队列尾的数小,弹出队列尾的数。
    while (dq.size() && a[i] < a[dq.back()]) {
        dq.pop_back();
    }
    dq.push_back(i);
    // 队首元素即为子区间中最小的元素
    cout << a[dq.front()] << " ";
}