码蹄集OJ-大约
#include<bits/stdc++.h>
using namespace std;
priority_queue<int>max2,maxDel;
priority_queue<int,vector<int>,std::greater<int>>min2,minDel;
const int N=1e5+1;
int n,result=0,a[N];
int main( )
{cin>>n;for(int i=1,j=1;i<=n;i++){cin>>a[i];max2.push(a[i]);min2.push(a[i]);while(max2.top()-min2.top()>1){maxDel.push(a[j]);minDel.push(a[j]);j++;while(!maxDel.empty() &&max2.top()==maxDel.top()){max2.pop();maxDel.pop();}while(!minDel.empty() &&min2.top()==minDel.top()){min2.pop();minDel.pop();}} result=max(result,i-j+1);}cout<<result;return 0;
}
要想找到滑动窗口的最大值,想到运用双指针实现滑动窗口,运用大根堆小根堆求出每一个窗口的最大值,最小值。
大根堆小根堆的初始化:
priority_queue<int>max2,maxDel;
priority_queue<int,vector<int>,std::greater<int>>min2,minDel;
定义双指针i,j。i,j初始指向第一个元素,i依次向后遍历,同时加入到大根堆和小根堆中,将这两个堆头元素相减得到最大值减最小值。
当差值大于一时,循环的将j指针指向的数组值加入maxDel和minDel(因为不确定加入的值为多大),将j指针向后移一位。同时判断移除的数影响最大值还是最小值,如果影响最大值,则按照maxDel中数的多少pop出大根堆中的元素。最后输出结果为滑动窗口的最大值,滑动窗口的大小为i-j+1。
注意:在调用堆(类似队列)时一定要判空,因为在调用空队列时会报错。