单调队列(一套模板通吃)
单调队列
- 利用双端队列实现
- 初始化双端队列
- 维护队头是最大元素
- 维护队头是最小元素
- 利用数组实现
- 维护队头是最大元素
顾名思义,就是用一点巧妙的方法,使得队列中的元素全是单调递增或递减,常常用来解决滑动窗口的一系列问题。
好了,废话不多说,上正题。
模板思路在代码中,超详细,看完你就悟了。
利用双端队列实现
初始化双端队列
void init()
{//必须从前边删while (!q1.empty()) q1.pop_front();while (!q2.empty()) q2.pop_front();}
维护队头是最大元素
k是区间范围。
struct node{int order;//对应下标int value;//对应值
}tmp;
deque<node>vis;
int main()
{int n,k,t;scanf("%d%d",&n,&k);for(int i=0;i<n;i++){scanf("%d",&t);//当前值// 当队列不为空,i是当前值得小标与队头元素下标之差大于等于k//表明,虽然你队头大,但是已经不在有效范围了,所以要丢掉if(!vis.empty() && i-vis.front().order>=k) vis.pop_front();// 队列不为空,因为要维护的队列是队头是最大的,那么这个队列就//是一个递减队列(想一下),所以当前值要比队尾小才可以,//否则就将队尾元素丢掉,直到队尾比当前值小,或队列为空while(!vis.empty() && vis.back().value<=t) vis.pop_back();tmp.order=i;tmp.value=t;vis.push_back(tmp);if(i>=k-1){printf("%d\n",vis.front().value);}}
}
维护队头是最小元素
```cpp
struct node{int order;//对应下标int value;//对应值
}tmp;
deque<node>vis;
int main()
{int n,k,t;scanf("%d%d",&n,&k);for(int i=0;i<n;i++){scanf("%d",&t);//当前值if(!vis.empty() && i-vis.front().order>=k) vis.pop_front();// 其余都一样,只不过下面这一行,变成当前值要大于队尾,//结合上面想想就出来了,因为是要维护一个递增队列嘛while(!vis.empty() && vis.back().value>=t) vis.pop_back();tmp.order=i;tmp.value=t;vis.push_back(tmp);if(i>=k-1){printf("%d\n",vis.front().value);}}
}
利用数组实现
维护队头是最大元素
vector<int> maxSlidingWindow(vector<int>& nums, int k) {//存的是下标vector<int> q(nums.size(),0); vector<int> vec;int tail = 0;//队尾指针int head = 0;//队头指针for(int i = 0;i< nums.size();i++){//淘汰操作//和上边对比下,队列不为空,不就是队尾指针大于队头指针嘛//nums[i] 当前值,nums[q[tail-1]] 队尾值// 丢掉队尾元素,不就是将队尾指针前移嘛while(tail > head && nums[i] >= nums[q[tail-1]]) tail--;//尾插操作q[tail++] = i;//过期头删操作//q[head] 不就是对首小标嘛if(i - q[head] >= k) head++;if(i >= k) vec.push_back(nums[q[head]]);}return vec;}
看到这里大家有没有枉然大悟呀
单调队列(一套模板通吃)相关推荐
- 【CF 1195】Basketball Exercise/Submarine in the Rybinsk Sea (hard edition)/OpenStreetMap+二维单调队列滑动窗口模板
寡人认为C,E都是比较板的题 butD2也太ex了,大大是被那个mod精给弄疯了,我mod了那么多次还是炸了longlong orz 文章目录 二维单调队列模板 C:Basketball Exerci ...
- 多重背包O(VN)算法——单调队列优化
多重背包问题: 有N种物品和容量为V的背包,若第i种物品容量为v[i],价值为w[i],总共有n[i]件,怎样装才能使背包内的物品总价值最大? 设dp[i][j]表示对容量为j的背包,处理完前i种物品 ...
- 365天挑战LeetCode1000题——Day 124 单调队列模板
单调队列模板 class MaxQueue {private:queue<int> origin;deque<int> dq; public:MaxQueue() {}int ...
- hdu3415 单调队列模板题
比较裸的单调队列 先求前缀和,枚举所有结束位置1~n+k即可 #include<iostream> #include<cstdio> #include<cstring&g ...
- 信息竞赛进阶指南--单调队列模板
// 单调队列 int l = 1, r = 1; q[1] = 0; // save choice j=0 for(int i = 1; i <= n; i++) {while (l < ...
- POJ2823 滑动窗口 单调队列模板题 第一次用了发函数指针
题意 有一个n长的序列,用k长的窗口在上面滑动,去每次窗口中最小和最大的数. 思路 使用单调队列,维护这个队列是单调的.以取最小元素为例,若窗口内左边元素>=右边元素,则左边元素失去保留的意义, ...
- 0x12.基本数据结构 — 队列与单调队列
目录 一.队列 0.UVA540 团体队列 Team Queue 1.AcWing 133. 蚯蚓(模拟优先队列) 二 .单调队列 0.AcWing 135. 最大子序和(单调队列) 1.luogu ...
- 【数据结构】单调栈和单调队列 详解+例题剖析
算法:单调栈和单调队列 一.单调栈和单调队列 二.单调栈例题 1.模板题入门 2.不懂不要急,看这道题 三.单调队列例题 1.入门 2.进阶 一.单调栈和单调队列 单调栈和单调队列与普通的栈,队列不同 ...
- python视频网站项目_Python超羽量级灵活框架 Flask实战微电影视频网站 大小项目通吃 Flask实战项目...
课程名称: Python超羽量级灵活框架 Flask实战微电影视频网站 大小项目通吃 Flask实战项目视频教程 课程简介: Flask作为Python编写的Web小型框架,可以使用Python快速开 ...
最新文章
- 我是一个机箱 《转载》
- 上不了网,我的解决过程
- Js基本函数 2017-03-20
- 消除电脑的四大噪音源
- P4071-[SDOI2016]排列计数【组合计数,错排】
- SAP ABAP打印MM采购发票打印开发
- maven使用出现的错误
- hive 配置mysql_Hive的mysql安装配置
- Centos7访问本地电脑共享文件夹遇到的问题
- 中小企业的进步:热爱大数据
- 转:正则表达式简介及在C++11中的简单使用
- SQL的别名和SQL的执行顺序和SQL优化
- Java实现简单图书管理系统
- android打开cad文件怎么打开方式,dwg文件怎么打开_手机上dwg文件用什么程序可以打开...
- 海思移植 APR(Apache Portable Runtime)
- 第三阶段应用层——1.6 数码相册—使用FreeType在LCD上显示多行文字
- Flutter pageview indicator指示器实现
- 手机计算机图标大全,我的电脑里我的手机图标怎么删除
- php中插入word文档,word里如何插入pdf
- 曼尼托巴大学计算机科学专业怎么样,加拿大曼尼托巴大学优势专业有哪些
热门文章
- mysql 乐观锁 version_乐观锁-version的使用
- linux关闭xdmcp服务,使用Xmanager远程CentOS 7服务器(XDMCP)
- An internal error occurred during: Launching MVC on Tomcat 6.x.
- 导出PDF和Zip文件的工具类
- 「后端小伙伴来学前端了」Vue脚手架中 render 函数
- 八皇后时间复杂度_回溯算法 | 追忆那些年曾难倒我们的八皇后问题
- savexml php,PHP DOMDocument saveXML()用法及代码示例
- greenplum客户端工具_如何从Teradata迁移到Greenplum(上篇)
- 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题
- python上传文件到windows_python自动化-WinSpy+pywin32文件上传操作