当前位置: 首页 > news >正文

一、基础数据结构——2.队列——3.双端队列和单调队列1

参考资料:《算法竞赛》,罗勇军 郭卫斌 著
本博客作为阅读本书的学习笔记,仅供交流学习。
建议关注 罗勇军老师博客

删除线格式
今天想到考完研去找工作面试被问到的问题:
C与C++有什么区别?
我当时的答案(毫无训练痕迹): 差不多,输入输出好像不一样
事实上,c和c++都可以使用scanf进行输入,使用printf进行输出
找到AI的答案: C是面向过程的语言,多用于操作系统等的开发;C++是面向对象的语言,比较适合大型项目的开发。
删除线格式

1.2.3 双端队列和单调队列

1. 双端队列

双端队列是一种具有队列和栈性质的数据结构,能且只能在两端进行插入和删除,简要实现代码如下:

const int N = 1e5;		//队列大小,确保够用
int que[N], head, tail; //队列和头、尾指针,队列大小=tail-head+1
head++;//弹出队头
que[--head] = data;//数据data入队头,注意溢出
que[head];//读队头数据
tail--;//弹走队尾
que[++tail] = data;//数据data入队尾,注意溢出

使用STL标准库的双端队列dequeue更可靠,详细用法的参考链接给出如下:
C++ STL deque容器(详解版)
双端队列的经典运用是单调队列。单调队列中的元素是单调有序的,且元素在队列的顺序和原来在序列中的一致,单调队列的队头和队尾都能入队和出队。
————————————————————————————————

滑动窗口 /【模板】单调队列(洛谷P1886)

题目描述

有一个长为 n n n 的序列 a a a,以及一个大小为 k k k 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

例如,对于序列 [ 1 , 3 , − 1 , − 3 , 5 , 3 , 6 , 7 ] [1,3,-1,-3,5,3,6,7] [1,3,1,3,5,3,6,7] 以及 k = 3 k = 3 k=3,有如下过程:

窗口位置 最小值 最大值 [1   3  -1] -3   5   3   6   7  − 1 3 1  [3  -1  -3]  5   3   6   7  − 3 3 1   3 [-1  -3   5]  3   6   7  − 3 5 1   3  -1 [-3   5   3]  6   7  − 3 5 1   3  -1  -3  [5   3   6]  7  3 6 1   3  -1  -3   5  [3   6   7] 3 7 \def\arraystretch{1.2} \begin{array}{|c|c|c|}\hline \textsf{窗口位置} & \textsf{最小值} & \textsf{最大值} \\ \hline \verb![1 3 -1] -3 5 3 6 7 ! & -1 & 3 \\ \hline \verb! 1 [3 -1 -3] 5 3 6 7 ! & -3 & 3 \\ \hline \verb! 1 3 [-1 -3 5] 3 6 7 ! & -3 & 5 \\ \hline \verb! 1 3 -1 [-3 5 3] 6 7 ! & -3 & 5 \\ \hline \verb! 1 3 -1 -3 [5 3 6] 7 ! & 3 & 6 \\ \hline \verb! 1 3 -1 -3 5 [3 6 7]! & 3 & 7 \\ \hline \end{array} 窗口位置[1   3  -1] -3   5   3   6   7  1  [3  -1  -3]  5   3   6   7  1   3 [-1  -3   5]  3   6   7  1   3  -1 [-3   5   3]  6   7  1   3  -1  -3  [5   3   6]  7  1   3  -1  -3   5  [3   6   7]最小值133333最大值335567

输入格式

输入一共有两行,第一行有两个正整数 n , k n,k n,k
第二行 n n n 个整数,表示序列 a a a

输出格式

输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值

样例 #1

样例输入 #1

8 3
1 3 -1 -3 5 3 6 7

样例输出 #1

-1 -3 -3 -3 3 3
3 3 5 5 6 7

提示

【数据范围】
对于 50 % 50\% 50% 的数据, 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105
对于 100 % 100\% 100% 的数据, 1 ≤ k ≤ n ≤ 1 0 6 1\le k \le n \le 10^6 1kn106 a i ∈ [ − 2 31 , 2 31 ) a_i \in [-2^{31},2^{31}) ai[231,231)

2. 单调队列和滑动窗口
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int a[N];
deque<int> q;//队列中的数据实际上是元素在原序列中的位置
int main() {int n,m; scanf("%d %d",&n,&m);for (int i = 1; i <= n; ++i) scanf("%d",&a[i]);for (int i = 1; i <= n; ++i) {//输出最小值while(!q.empty()&&a[q.back()]>a[i])q.pop_back();//去尾q.push_back(i);if(i>= m){//每个窗口输出一次while (!q.empty()&&q.front()<=i-m)q.pop_front();//删头printf("%d ",a[q.front()]);}}printf("\n");while(!q.empty()) q.pop_front();//清空,下面再用一次for (int i = 1; i <= n; ++i) {//输出最大值while(!q.empty()&&a[q.back()]<a[i]) q.pop_back();//去尾q.push_back(i);if (i >= m){while(!q.empty()&&q.front()<=i-m) q.pop_front();//删头printf("%d ",a[q.front()]);}}printf("\n");return 0;
}

相关文章:

  • 【Ant Design of Vue】Modal.confirm无法关闭的bug
  • 如何在Linux部署JumpServer堡垒机并实现远程访问本地服务
  • mybatis的缓存机制
  • vue中合并下载打包视频图片
  • Gitee Reward让开源作者不再为爱发电
  • 数组练习 Leetcode 566.重塑矩阵
  • Pytest插件pytest-django让Django测试更高效
  • Spring data都包含哪些内容
  • 100天精通Python(实用脚本篇)——第113天:基于Tesseract-OCR实现OCR图片文字识别实战
  • 蓝桥杯官网填空题(海盗与金币)
  • 【C++】类和对象
  • MyBatis 的XML实现方法(JAVA)
  • Android 基础技术——addView 流程
  • vue+elenemt分页+springboot
  • 幻读是什么,用什么隔离级别可以防止幻读?
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • canvas 高仿 Apple Watch 表盘
  • Cumulo 的 ClojureScript 模块已经成型
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java基本数据类型之Number
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 仿天猫超市收藏抛物线动画工具库
  • 复杂数据处理
  • 解析带emoji和链接的聊天系统消息
  • 那些被忽略的 JavaScript 数组方法细节
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 微服务框架lagom
  • 栈实现走出迷宫(C++)
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​决定德拉瓦州地区版图的关键历史事件
  • #162 (Div. 2)
  • #Ubuntu(修改root信息)
  • #大学#套接字
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (第61天)多租户架构(CDB/PDB)
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (原)本想说脏话,奈何已放下
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)用.Net的File控件上传文件的解决方案
  • (轉)JSON.stringify 语法实例讲解
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .Net 4.0并行库实用性演练
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET中两种OCR方式对比
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [2016.7 Day.4] T1 游戏 [正解:二分图 偏解:奇葩贪心+模拟?(不知如何称呼不过居然比std还快)]