#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[N], ms[N];
int main()
{
int n, k;
cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> a[i];
int h = 1, t = 0;
for(int i = 1; i <= n; i++)
{
#1 while(h <= t && a[i] <= a[ms[t]]) t--;
#2 ms[++t] = i; //要位于队头出前,保证队列内一定有元素,防止++t == h造成的空出影响
#3 if(ms[h] < i - k + 1) h++;
if(i >= k) cout << a[ms[h]] << " ";
}
puts("");
h = 1, t = 0;
for(int i = 1; i <= n; i++)
{
while(h <= t && a[i] >= a[ms[t]]) t--;
ms[++t] = i;
if(ms[h] < i - k + 1) h++;
if(i >= k) cout << a[ms[h]] << " ";
}
}
直接上结论:
h = 1, t = 0 与 h = 0, t = -1都可以, 没区别。
数组下表如果从1开始,会导致 i - k + 1 在 k = 1的条件下 为 1,而一般数组初始化值为0,这样空元素也可能h++。
对此给出2个解决方案:
1.memset(ms, 0x3f, sizeof ms)。
2. #2语句在#3语句之前,使得开始ms[h] = 1。
总结:
下标从0开始,唯一要求的顺序是:
#1 先于 #2
下标从1开始:
#1 先于 #2
#2 先于 #3(除非改初始化值)