单调栈
视频连接
#include<iostream>
using namespace std;
const int N = 100010;
int stk[N], tt;
int main() {
int n;
cin >> n;
while (n--) {
int x;
scanf("%d", &x);
while (tt && stk[tt] >= x)
tt--;
if (!tt)
printf("-1");
else
printf("%d", stk[tt]);
stk[++tt] = x;
}
}
单调队列
滑动窗口
using namespace std;
const int N = 1000010;
//a[N]数组就是输入的原型数组
//q[N]数组是保存单调队列的数组,但是是通过保存下标来保存单调队列的。
int a[N], q[N], hh, tt = -1;
//hh是单调队列的队头,tt是单调队列的队尾
int main()
{
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> a[i]; //向原型数组中录入数据
if (i - k + 1 > q[hh]) hh++;
//这里很重要,i-k+1是什么?i - k + 1 是滑动窗口的做左侧的坐标。
// 这个坐标要是大于q[hh]说明q数组队头元素已经出了窗口之外了,也就是取不到了直接出队就行了
while (hh <= tt && a[i] <= a[q[tt]]) tt--;
//这里在求最小值,a[i] <= a[q[tt]]就是代表只要队尾的元素大于a[i]就出队,
// 因为求的是最小值,所以大于的就可以直接出对了,反正取最小值也轮不到他们
q[++tt] = i;
if (i + 1 >= k) cout << a[q[hh]] << " ";
//i + 1代表什么?i + 1就是原型数组的实际长度,只要实际长度大于k了说明,
// 原型数组中最起码可以出现一个滑动窗口了,就可以开始输出值了
}
//求最大值思路类似,改个判断就行了
cout << endl;
hh = 0;
tt = -1;
for (int i = 0; i < n; i++)
{
if (i - k + 1 > q[hh]) hh++;
while (hh <= tt && a[i] >= a[q[tt]]) tt--;
q[++tt] = i;
if (i + 1 >= k) cout << a[q[hh]] << " ";
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理