简单单调队列原理
来源:互联网 发布:db2执行sql脚本有换行 编辑:程序博客网 时间:2024/06/07 13:50
单调队列用最简单的理解就是在一个数组a中求所有的k个连续元素内(定义为一个视窗)的最大的元素:
维护一个类似队列的数组b,从队尾依次添加原数组的元素j,此时队首的元素i位置在视窗外(i<j-k)时,删除它;再从队尾向前,将所有小于a[j]的元素都删除,保证队列队尾到队首呈递增状;对于队首元素i,如果i到j即是整个视窗(j -- i = k ),那么队首i元素就是视窗内最大的;如果i在视窗内部(j - k < i ),从j-k到i的那部分元素被i(或更前面)的元素删除了,而这部分元素肯定都在i(或更小)元素所对应的视窗内,i(或更小)元素要比这部分元素大才能进行删除,所以从j-k到i的元素,i元素也比它们都大,所以这个队列维护的队首即为 j到j-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
- 简单单调队列原理
- 单调队列的原理
- 单调队列的简单运用
- 单调队列—使用介绍与原理
- FZU 1894 志愿者选拔(简单单调队列)
- poj 2823 Sliding Window(简单单调队列)
- poj 2823 简单单调队列优化dp
- HUD 3706 单调队列简单题
- 单调栈 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- 单调队列
- java求两个数组的并集、交集、差集
- 封装的的应用场景和步骤
- linux中shell变量$#,$@,$0,$1,$2的含义解释
- 链接qt下sqlite数据库
- KEIl工具之scatter file分散加载文件1
- 简单单调队列原理
- eclipse最有用快捷键整理
- 关于CSS分页栏
- 【LeetCode】015.3Sum
- 构造函数的相关知识
- Android 实现按两次返回键退出程序
- <Head First 设计模式>:复合模式:duck
- 接口
- cf437C 贪心算法