由以下这个代码让我深深的感知了一下
就是1.我自己心里面得有一个想法就是是下标问题 得移动 就是一旦发现可以后移动之后就开始移动
2.在移动这个地方要知道就是q[++tt]其实这个地方挺神奇的因为这个地方就是相当于不停的可移动可以很随意的移动 相当于这个是一个动态的指针 而那个hh就是一个不怎么动的指针
3.我个人认为对于这个代码不是特好理解 背吧 就是那几个比较重要的点
总体思路就是1.首先先判断左边界
2.如果这个数不是单调递升怎么办
3.不断更新这个tt指针的坐标
4.要是能输出就直接输出
# include <iostream>
using namespace std;
const int N = 1000010;
int a[N], q[N], hh, tt = -1;
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; // 若队首出窗口,hh加1
while (hh <= tt && a[i] <= a[q[tt]]) -- tt; // 若队尾不单调,tt减1
q[++ tt] = i;
cout <<" 下标移动" << hh << " " << tt << endl;
cout <<"代表的值" << q[hh] << " " << q[tt] << endl;
// 下标加到队尾
if (i + 1 >= k)cout << a[q[hh]] << endl;
// 输出结果
}
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) printf("%d ", a[q[hh]]);
//}
return 0;
}
其实会看这个代码和上篇文章的那个代码挺像都是这种单调的栈 只不过这个栈是就指定的范围求这个最值 上一篇文章是一个相对来说范围不是问题
然而这篇文章这个范围很重要
你在仔细品品 代码核心部分几乎一模一样
其实有的时候对于这个种类行的题一也可以理解为下标掩盖 (如果你认为我理解的有毛病请及时提出,并给出你的理解,谢谢)
以上这个代码借鉴别人写的 不是本人