链接
题意:
思路:开两个单调队列找最大值和最小值
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+100;
int a[maxn];
deque<int >m1;
int main()
{
int n,k,i,j;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++){
while(m1.size()&&a[i]<a[m1.back()]){
m1.pop_back();
}
m1.push_back(i);
while(i-k>=m1.front()){
m1.pop_front();
}
if(i>=k)
printf("%d ",a[m1.front()]);
}
printf("\n");
m1.clear();
for(i=1;i<=n;i++){
while(m1.size()&&a[i]>a[m1.back()]){
m1.pop_back();
}
m1.push_back(i);
while(i-k>=m1.front()){
m1.pop_front();
}
if(i>=k)
printf("%d ",a[m1.front()]);
}
return 0;
}
这篇博客介绍了如何利用单调队列解决编程问题,具体是找到数组中每个长度为k的连续子数组的最大值和最小值。通过两个单调队列,分别维护当前窗口内的最大值和最小值,实现高效求解。代码中展示了具体的实现细节,包括队列的更新和元素的插入删除操作。
2001

被折叠的 条评论
为什么被折叠?



