简单单调队列原理

来源:互联网 发布:db2执行sql脚本有换行 编辑:程序博客网 时间:2024/06/07 13:50

单调队列用最简单的理解就是在一个数组a中求所有的k个连续元素内(定义为一个视窗)的最大的元素:

维护一个类似队列的数组b从队尾依次添加原数组的元素j,此时队首的元素i位置在视窗外(i<j-k,删除它;再从队尾向前,所有小于a[j]的元素都删除,保证队列队尾到队首呈递增状;对于队首元素i,如果ij是整个视窗(j --  i = k ),那么队首i元素就是视窗内最大的;如果i在视窗内部(j - i ),从j-ki那部分元素i(或更前面)的元素删除了,而这部分元素肯定都在i(或更小)元素所对应的视窗内i(或更小)元素要比这部分元素大才能进行删除,所以从j-ki的元素i元素也比它们都大,所以这个队列维护的队首即为 jj-k最大的元素。(想当与维护了出一个递减的序列,比一般方法就减少了时间复杂度)

代码:

memset(b,0,sizeof(b));//存放相应序号的队列
        for(int i=0; i<n; i++)
scanf("%d",&a[i]);
        for(int j=0,
s=0,e=0; j<n; j++)

        {
            if(j-b[s]>=k)s++;//队首在视窗外
            while(e>=s&&a[j]>a[b[e]])e--;//去除比新加元素小的
            b[++e]=j;
            printf("%d\n",a[b[s]]);
        }

0 0