三个窗口的最小值
运行下面这段程序:
本节模型:window_max / window_min 用 std::deque 存下标做单调队列,求每个长度为 k 的窗口的最值。
#include <algorithm>
#include <deque>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> window_min(const vector<int>& a, int k) {
// 每个长度为 k 的窗口的最小值
deque<int> dq; // 存下标,对应的值从队首到队尾递增
vector<int> res;
for (int i = 0; i < (int)a.size(); i++) {
while (!dq.empty() && a[dq.back()] >= a[i]) dq.pop_back();
dq.push_back(i);
if (dq.front() <= i - k) dq.pop_front();
if (i >= k - 1) res.push_back(a[dq.front()]);
}
return res;
}
string join(const vector<int>& v) {
string s;
for (size_t i = 0; i < v.size(); i++) s += (i ? "," : "") + to_string(v[i]);
return s;
}
int main() {
cout << join(window_min({4, 2, 6, 1, 5}, 3)) << endl;
}
(本题用 g++ -std=c++17 -O0 编译。)
全部评论