算法基础之滑动窗口

滑动窗口

  • 主要思想:单调队列 保证队列中下标跨度始终为3个数

    • 算法基础之滑动窗口_第1张图片

      • q[N]维护数组中元素下标 方便判断窗口大小
    •   #include
        #include
        
        using namespace std;
        
        const int N=1000010;
        
        int a[N],q[N];
        int n,k,hh,tt=-1;
        
        int main(){
            cin>>n>>k;
            for(int i=0;i<n;i++){
                scanf("%d", &a[i]);
            }
            for(int i=0;i<n;i++){
                while(hh<=tt && a[q[tt]]>=a[i]) tt--; //队列非空 并且 新元素更优
                if(hh<=tt && q[hh] < i-k+1) hh++; //q[hh]为左端点下标 3
                q[++tt] = i; //将当前新元素下标保存
                if(i>=k-1) cout<<a[q[hh]]<<" ";  //从k+1往后 每一次都输出最小值
            }
            cout<<endl;
            
            hh=0,tt=-1;
            
            for(int i=0;i<n;i++){
                //只有这里有变动 <= 
                while(hh<=tt && a[q[tt]]<=a[i]) tt--;
                if(hh<=tt && q[hh] < i-k+1) hh++;
                q[++tt] = i;
                if(i>=k-1) cout<<a[q[hh]]<<" ";
            }
            cout<<endl;
        }
      

你可能感兴趣的:(算法,c++,数据结构)