计算机

单调队列

单调队列可以看做一种特殊的 (链接未公开),它可以与双指针法结合,求出双指针所在区间的最大值或最小值。

最长见的应用是求定长(链接未公开)的最小值。

滑动窗口最小值

基本操作:开一个双端队列 deque,首先进行预处理,然后将过期的元素删除,再将新的元素插入。插入的过程中,若队尾元素比待插入元素大,则弹出队尾。

代码

实现时,注意弹出元素前都需要先检查队列是否为空。

struct Elem {
	size_t idx;
	int val;
};
deque<Elem> dq;

for (size_t i = 1; i <= n; i++)
{
	while (!dq.empty() && dq.front().idx + k <= i)
	{
		dq.pop_front();
	}
	while (!dq.empty() && dq.back().val > a[i])
	{
		dq.pop_back();
	}
	dq.push_back({i, a[i]});
	if (i >= k)
	{
		cout << dq.front().val << " \n"[i == n];
	}
}

应用

双指针最小值

双指针法的两个指针在移动过程中,都只会往下标增加的方向移动。

BEYOND THE ARTICLE

读完了,有什么想法?

阅读已保存的问答示例,并循着引用回到原文。

查看公开问答示例
— 本文完 — 返回文章列表