0x12 队列

0x12 队列

队列是一种“先进先出”的线性数据结构。一般来说,元素从右端进入队列,从左端离开队列。于是我们称队列的左端为队头,右端为队尾。

队列还有许多变体。例如两端都能插入或者取出元素的双端队列(C++ S T L STL STL d e q u e deque deque),给每个元素附带一个评估值、出队时取出估值最大的、等价于一个二叉堆的优先队列(C++ S T L STL STL p r i o r i t y _ q u e u e priority\_queue priority_queue)。队列也是广度优先搜索的基本结构。

1.单调队列

给定一个长度为N的整数序列(可能有负数),从中找出一段长度不超过M的连续子序列,使得子序列中所有数的和最大。 N , M ≤ 3 ∗ 1 0 5 N,M\leq 3*10^5 N,M3105

计算“区间和”的问题,一般转化为“两个前缀和相减“的形式进行求解。问题就转化成找出两个位置x,y,使得 S [ y ] − S [ x ] S[y]-S[x] S[y]S[x]最大并且 y − x ≤ M y-x\leq M yxM

首先我们枚举右端点 i i i,当 i i i固定时,问题就变为:找到一个左端点 j j j,其中 j ∈ [ i − m , i − 1 ] j\in[i-m,i-1] j[im,i1]并且 S [ j ] S[j] S[j]最小

不妨比较一下任意两个位置 j j j k k k,如果 k < j < i k<j<i k<j<i并且 S [ k ] > s [ j ] S[k]>s[j] S[k]>s[j],那么对于所有大于等于 i i i的右端点, k k k永远不会成为最优选择。这是因为不但 S [ k ] S[k] S[k]不小于 S [ j ] S[j] S[j],而且 j j j k k k i i i更近,长度更不容易超过 M M M,即 j j j的生存能力比 k k k更强。

以上比较告诉我们,可能成为最优选择的策略集合一定是一个“下标位置递增、对应前缀和S的值也递增”的序列。我么可以用一个队列保护这个序列。随着右端点变从前往后扫描,我们可以对每一个 i i i执行以下三个步骤:

1.判断队头决策与 i i i的距离是否超过 M M M的范围,若超过则出队。

2.此时队头就是右端点为 i i i时,左端点 j j j的最优选择。

3.不断删除队尾决策,直到队尾对应的 S S S值小于 S [ i ] S[i] S[i]。然后把 i i i作为一个新的决策入队。

int ans=0;
int l=1,r=1;
q[1]=0;
for(int i=1;i<=n;++i)
{while(l<=r&&q[l]<i-m)l++;ans=max(ans,sum[i]-sum[q[l]]);while(l<=r&&sum[q[r]]>=sum[i])r--;q[++r]=i;
}

这就是著名的单调队列算法,因为每个元素至多入队一次、出队一次,所以整个算法的时间复杂度就是 O ( n ) O(n) O(n)。它的思想也是在决策集合(队列)中及时排除一定不是最优解的选择。单调队列是优化动态规划的一个重要手段,我们将在0x59节中详细讲解。

实际应用:单调队列是一种主要解决滑动窗口类的数据结构,它可以维护区间的最值,最值在队首。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/220360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS7安装 Docker Compose

docker系列 CentOS7安装 Docker Compose docker系列前言1、下载 Docker Compose2、 授权执行权限3、添加软链接4、验证安装 前言 下面的操作是在centos7中完成的。这里安装的是2.23.3版本的docker-compose。 1、下载 Docker Compose 确保你具有 curl 工具&#xff0c;然后使用…

python基于http的网络通信和网站端口暴露;Python网络编程之HTTP协议的python应用

一、HTTP协议概述 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;即超文本传输协议&#xff0c;是Web应用程序使用的协议&#xff0c;在Web浏览器和Web服务器之间传递HTML页面和数据。HTTP是基于TCP/IP协议来传输数据的&#xff0c;是一种无状态的协议。 关键特点…

每个开发人员都想使用的编程语言

在任何时候&#xff0c;一些编程语言都会把大量的开发人员变成热情的布道者&#xff0c;试图说服世界其他地方的人相信它的伟大。 当热起来的时候&#xff0c;这种语言可能会成为行业标准&#xff0c;但其他时候&#xff0c;这种受欢迎程度就会消失。 在这个故事中&#xff0…

模拟I2C通信

test.c #include "iic.h"extern void printf(const char *fmt, ...); /** 函数名 &#xff1a; delay_us* 函数功能&#xff1a;延时函数* 函数参数&#xff1a;无* 函数返回值&#xff1a;无* */ void delay_us(void) {unsigned int i 2000;while (i--); } void d…

【JVM从入门到实战】(五)类加载器

一、什么是类加载器 类加载器&#xff08;ClassLoader&#xff09;是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。 类加载器只参与加载过程中的字节码获取并加载到内存这一部分。 二、jdk8及之前的版本 类加载器分为三类&#xff1a; 启动类加载器-加载Ja…

golang游戏服务器 - tgf系列课程07

数据管理 使用数据管理工具,对玩家数据进行自动化的缓存管理.需求描述 用户登录成功之后,我们需要根据用户的账号,创建用户的数据,并且将数据存放到mysql和redis中.之后我们通过接口,修改玩家的昵称,然后重新登录.观察数据是否准确准备工作 在开始服务器的代码编程之前,我们…

Linux cp命令教程:如何复制文件和目录(附案例详解和注意事项)

Linux cp命令介绍 cp命令在Linux中用于复制文件或目录。它的全称是copy&#xff0c;意为复制。使用cp命令&#xff0c;你可以将文件或目录从一个位置复制到另一个位置。 Linux cp命令适用的Linux版本 cp命令在所有主流的Linux发行版中都是可用的&#xff0c;包括但不限于Ubu…

绩效面谈为什么失败?

绩效面谈是整个绩效管理过程中的核心环节&#xff0c;是绩效反馈环节的重要手段之一。绩效面谈工作的成功与否直接关系到绩效管理体系能否良性运行&#xff0c;绩效改善的目标能否真正实现。对于许多已经导入绩效管理理念&#xff0c;并初步建立起绩效管理体系的企业来说&#…

pip install默认安装路径

pip install默认安装路径 当使用pip工具安装Python包时&#xff0c;默认情况下&#xff0c;包会被安装到Python的site-packages目录中。这个目录的路径取决于你的操作系统和Python的安装方式。 在Windows操作系统上&#xff0c;pip默认安装路径通常是C:\PythonXX\Lib\site-…

express 下搞一个 websocket 长连接

安装模块 npm i express npm i express-ws 新建文件app.js 先安排源码 监听端口 7777 var express require(express) var app express() require(express-ws)(app)var port 7777 var clientObject {} app.ws(/, (client, req) > {// 连接var key req.socket.re…

预测性维护对制造企业设备管理的作用

制造企业设备管理和维护对于生产效率和成本控制至关重要。然而&#xff0c;传统的维护方法往往无法准确预测设备故障&#xff0c;导致生产中断和高额维修费用。为了应对这一挑战&#xff0c;越来越多的制造企业开始采用预测性维护技术。 预测性维护是通过传感器数据、机器学习和…

计算机网络——习题——书上原题

目录 第一章 1. 填空题 第二章 1. 填空题 第三章 1. 填空题 2.选择题 第四章 1. 填空题 第五章 第六章 1. 填空题 第一章 1. 填空题 &#xff08;1&#xff09;计算机网络的主要功能包括 资源共享、数据通信、分布式处理、提高计算机的可靠性和集中管理 。 &…

上海亚商投顾:沪指再度失守3000点 北向资金净卖出近百亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日集体调整&#xff0c;尾盘均跌超1%&#xff0c;北证50则逆势拉升涨超3%。医药股逆势走强&#xf…

Node.js模块化的基本概念和分类及使用方法

1.模块概念 模块&#xff1a;指解决一个复杂问题的时候&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来讲&#xff0c;模块是可以组合、分解和更换的单元。 在编辑领域中的模块&#xff0c;就是遵守固定的规则&#xff0c;把一个大文件拆成独立并且相互…

devops相关面试题

1、发布10 NPM包,熟悉NRM、NVM。 1、谈谈你参与发布的NPM包,它们解决了什么问题,有什么特点? NPM: 是 Node.js 默认的包管理工具 NRM&#xff1a;是 Node.js 源管理工具 NVM&#xff1a;Node.js 版本管理工具 我参与发布的NPM包为mk-form,它通过配置生成和验证复杂表单,简化…

网络编程及相关概念

网络 概念&#xff1a;两台或多台设备通过一定物理设备连接起来构成了网络 根据网络的覆盖范围不同&#xff0c;对网络进行分类&#xff1a; 局域网&#xff1a;覆盖范围最小&#xff0c;仅仅覆盖一片小区域。 城域网&#xff1a;覆盖范围较大&#xff0c;可以覆盖一个城市。…

打印机怎么扫描文件到电脑?6个步骤!轻松完成!

“在工作时我经常需要用到打印机&#xff0c;有时候需要将部分文件扫描到电脑。但是我不是很清楚应该如何操作&#xff0c;有什么方法可以让打印机快速传输文件到电脑的方法吗&#xff1f;” 在人们的工作和学习中&#xff0c;打印机成了很多用户的必备工具。人们可以用它来打印…

C++中的接口有什么用

2023年12月13日&#xff0c;周三上午 今天上午在适配器模式&#xff0c;我发现如果想真正理解适配器模式&#xff0c;就必须学会使用C中的接口&#xff0c;就必须明白为什么要在C中使用接口&#xff0c;所以重新学习了一下C中的接口 目录 C中的接口有什么用用代码说明“实现多…

python注释规范

Python 中的函数注释通常使用文档字符串&#xff08;docstring&#xff09;来提供对函数的说明。文档字符串是放置在函数、模块或类的顶部的字符串&#xff0c;用于描述其功能、输入参数、返回值以及其他相关信息。以下是一些建议的 Python 函数注释规范&#xff1a; 使用三重…

本地搭建Linux DataEase数据可视化分析工具并实现公网访问

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…