原题链接:https://www.acwing.com/problem/content/156/
思路:
分析可知,对于找滑动窗口的最小值而言,如果 a[i]>a[j] (i<j),那么 a[i]与它后面的元素相比,一定不是最小值!!! 也就是说,不妨直接把 a[i] 给删掉。
代码:
for(int i = 1;i<=n;i++)
{
while(q.size() && q.back()>a[i])//如果队尾元素大于a[i],那么就把队尾弹出
q.pop_back();
q.push_back(a[i]); //进行入队操作
if(i-k>=1 && q.front() == a[i-k])//如果窗口滑出了q.front()元素,那么弹出
q.pop_front();
if(i>=k)
cout<<q.front()<<" ";
}
找最大值同理:
for(int i = 1;i<=n;i++)
{
while(q.size() && q.back()<a[i])
q.pop_back();
q.push_back(a[i]);
if(i-k>=1 && q.front() == a[i-k])
q.pop_front();
if(i>=k)
cout<<q.front()<<" ";
}
完整代码:
#include<bits/stdc++.h>
#define N 1000005
using namespace std;
int n,k;
int a[N];
deque<int> q;
int main()
{
cin>>n>>k;
for(int i = 1;i<=n;i++)
cin>>a[i];
for(int i = 1;i<=n;i++)
{
while(q.size() && q.back()>a[i])
q.pop_back();
q.push_back(a[i]);
if(i-k>=1 && q.front()== a[i-k])
q.pop_front();
if(i>=k)
cout<<q.front()<<" ";
}
cout<<"\n";
q.clear();
for(int i = 1;i<=n;i++)
{
while(q.size() && q.back()<a[i])
q.pop_back();
q.push_back(a[i]);
if(i-k>=1 && q.front() == a[i-k])
q.pop_front();
if(i>=k)
cout<<q.front()<<" ";
}
return 0;
}
特别的:
一定要具体问题具体分析!!!!