Peter算法小课堂—单调队列

2024-02-11 20:12

本文主要是介绍Peter算法小课堂—单调队列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

祝大家新年快乐!

今天这一次有点简单。

单调队列有两个要点,一个是单调,另一个就是我们的队列。

听到队列,我相信大家一定会想到它的好朋友BFS吧。但是……今天……可……没……那么……简单哦。

西佳佳偶像天团1

题目描述

西佳佳偶像天团共k人,最近n年每年有一位歌手加入。当人数超过k人时老团员自动退团。第i人的颜值为x[i],团内颜值最高者成为团长,求k人成团后每年的团长颜值是多少。

先试试样例八

输出样例:5 6                                         4 3 4 5                                 4 3 4 5 5 6

感觉有点难懂是吧,来来来,我们把他“具体化”一点。

固定长度滑动窗口最大值

单调队列主要解决的是这类问题↓

为了诠释这整个过程,我特意画了一张图

创作不易。

那么解决这类问题,我们有两种做法:1.平衡二叉查找树 2.单调队列。平衡二叉树我们用multiset实现;单调队列我们用数组模拟来实现,时间复杂度一样。

平衡二叉树

平衡二叉树分为红黑树、Splay树,Treap树。那么,我们用multiset实现,会比较简单

额……只不过把数组换成multiset而已

代码:

int n,k,x[N],ans[N];
cin>>n>>k;
for(int i=0;i<n;i++) cin>>x[i];
multiset<int> s;
for(int i=0;i<n;i++){s.insert(x[i]);if(i>=k) s.erase(s.find(x[i-k]));ans[i]=*s.rbegin();
}
for(int i=k-1;i<n;i++) cout<<ans[i]<<" ";

单调队列

单调队列主要如下图

所以,这就是一个删除、的过程。没有用的就删除,有用的保留。简单的来说:每一次要加入新元素时,将新元素的值与队尾的值比较,若新元素的值大,则删除队尾,若队尾的值大,则将新元素直接插入队列。新一轮的滑动之后,从队首来看,如果它不在滑动窗口内,那么就删除它。大家用这个方法,再来试试前面的样例。注意:队列里存的是编号,不是值。大家想想时间复杂度为什么时O(n)呢?因为每个元素最多进队1次,出队1次,最坏时间复杂度为O(2n)≈O(n)。大家试试写写代码把。

//单调队列
cin>>n>>k;
fir(int i=0;i<n;i++) cin>>x[i];
int l=0,r=0;
for(int i=0;i<n;i++){while(l<r&&i-q[l]>=k) l++;while(l<r&&x[i]>x[q[r-1]]) r--;q[r++]=i;ans[i]=x[q[l]];
}
for(int i=k-1;i<n;i++) cout<<ans[i]<<" ";

那么,总图我也给大家整理了,生怕你们看不懂

给大家看一个giao笑的代码

希望这些对大家有用,三连必回。最近两个月没有经常看CSDN,可能……会晚一点。

这篇关于Peter算法小课堂—单调队列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/700715

相关文章

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig