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

【面试高频算法解析】算法练习8 单调队列

前言

本专栏旨在通过分类学习算法,使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目,帮助您深度理解每种算法,避免出现刷了很多算法题,还是一知半解的状态


专栏导航

  1. 二分查找
  2. 回溯(Backtracking)
  3. 双指针
  4. 滑动窗口
  5. 深度优先搜索
  6. 广度优先搜索
  7. 贪心算法
  8. 单调队列
  9. 堆(Heap)
  10. 分治(Divide and Conquer)
  11. 动态规划

算法解析

单调队列是一种特殊的队列数据结构,其主要特点是保持队列元素的单调性(单调递增或单调递减)。在单调队列中,新元素的加入可能会导致队列中的一些元素被移除,以维护队列的单调性。

单调队列通常用于解决滑动窗口类问题,如寻找窗口内的最大值或最小值。使用单调队列能够在常数时间内获取窗口的最大或最小元素,从而有效地优化算法的时间复杂度。

以下是单调队列的两种主要操作:

  1. 入队(Push)
    当新元素加入队列时,从队列尾部开始,移除所有破坏队列单调性的元素,然后将新元素加入队列尾部。对于单调递增队列,如果新元素小于队尾元素,则队尾元素被移除;对于单调递减队列,如果新元素大于队尾元素,则队尾元素被移除。

  2. 出队(Pop)
    当需要移除队列头部元素时(例如滑动窗口移动导致窗口头部元素不再属于当前窗口),如果队头元素等于需要移除的元素,则将其出队。

单调队列可以用双端队列(deque)来实现,因为双端队列允许从两端高效地添加和移除元素。

下面是一个使用 Python 中的 collections.deque 实现单调递减队列的示例,该队列用于找到滑动窗口的最大值:

from collections import dequeclass MonotonicQueue:def __init__(self):self.deque = deque()def push(self, value):# 移除所有小于即将入队的值的元素while self.deque and self.deque[-1] < value:self.deque.pop()self.deque.append(value)def max(self):# 队列的最大值始终位于队头return self.deque[0]def pop(self, value):# 如果队头元素是即将移除的值,则出队if self.deque and self.deque[0] == value:self.deque.popleft()# 示例:滑动窗口最大值
def max_sliding_window(nums, k):window = MonotonicQueue()result = []for i, value in enumerate(nums):if i < k - 1:window.push(value)else:# 滑动窗口向右移动window.push(value)result.append(window.max())  # 记录当前窗口的最大值# 移除窗口最左边的值window.pop(nums[i - k + 1])return result# 使用示例
nums = [1,3,-1,-3,5,3,6,7]
k = 3
print(max_sliding_window(nums, k))  # 输出 [3,3,5,5,6,7]

在这个例子中,我们定义了一个 MonotonicQueue 类来模拟单调递减队列,并在滑动窗口中使用它来找到每个窗口的最大值。当新元素加入时,队列中所有小于新元素的值都会被移除,以保持队列的单调递减性。当窗口滑动时,如果队头的元素是窗口最左边即将移出窗口的值,则将其从队列中移除。


实战练习

购买水果需要的最少金币数

你在一个水果超市里,货架上摆满了玲琅满目的奇珍异果。

给你一个下标从 1 开始的数组 prices ,其中 prices[i] 表示你购买第 i 个水果需要花费的金币数目。

水果超市有如下促销活动:

如果你花费 price[i] 购买了水果 i ,那么接下来的 i 个水果你都可以免费获得。
注意 ,即使你 可以 免费获得水果 j ,你仍然可以花费 prices[j] 个金币去购买它以便能免费获得接下来的 j 个水果。

请你返回获得所有水果所需要的 最少 金币数。

示例 1:
输入:prices = [3,1,2]
输出:4

解释:你可以按如下方法获得所有水果:

  • 花 3 个金币购买水果 1 ,然后免费获得水果 2 。
  • 花 1 个金币购买水果 2 ,然后免费获得水果 3 。
  • 免费获得水果 3 。
    注意,虽然你可以免费获得水果 2 ,但你还是花 1 个金币去购买它,因为这样的总花费最少。
    购买所有水果需要最少花费 4 个金币。

示例 2:
输入:prices = [1,10,1,1]
输出:2

解释:你可以按如下方法获得所有水果:

  • 花 1 个金币购买水果 1 ,然后免费获得水果 2 。
  • 免费获得水果 2 。
  • 花 1 个金币购买水果 3 ,然后免费获得水果 4 。
  • 免费获得水果 4 。
    购买所有水果需要最少花费 2 个金币。

提示:
1 <= prices.length <= 1000
1 <= prices[i] <= 105

官方题解


环形子数组的最大和

给定一个长度为 n 的环形整数数组 nums ,返回 nums 的非空 子数组 的最大可能和 。

环形数组 意味着数组的末端将会与开头相连呈环状。形式上, nums[i] 的下一个元素是 nums[(i + 1) % n] , nums[i] 的前一个元素是 nums[(i - 1 + n) % n] 。

子数组 最多只能包含固定缓冲区 nums 中的每个元素一次。形式上,对于子数组 nums[i], nums[i + 1], …, nums[j] ,不存在 i <= k1, k2 <= j 其中 k1 % n == k2 % n 。

示例 1:
输入:nums = [1,-2,3,-2]
输出:3
解释:从子数组 [3] 得到最大和 3

示例 2:
输入:nums = [5,-3,5]
输出:10
解释:从子数组 [5,5] 得到最大和 5 + 5 = 10

示例 3:
输入:nums = [3,-2,2,-3]
输出:3
解释:从子数组 [3] 和 [3,-2,2] 都可以得到最大和 3

提示:
n == nums.length
1 <= n <= 3 * 104
-3 * 104 <= nums[i] <= 3 * 104​​​​​​​

官方题解

相关文章:

【面试高频算法解析】算法练习8 单调队列

前言 本专栏旨在通过分类学习算法&#xff0c;使您能够牢固掌握不同算法的理论要点。通过策略性地练习精选的经典题目&#xff0c;帮助您深度理解每种算法&#xff0c;避免出现刷了很多算法题&#xff0c;还是一知半解的状态 专栏导航 二分查找回溯&#xff08;Backtracking&…...

ATTCK视角下的信息收集:Sysmon检测

目录 1、简介 2、使用Sysmon 3、检测Sysmon是否安装运行 4、检测Sysmon是否被卸载 5、使Sysmon在终端隐匿运行的技术 1、简介 Sysmon&#xff08;系统监视器&#xff09;是由windows sysinternals 出品的Sysinternals 系列工具中的一个 它是windows系统服务和设备驱动程…...

02、Kafka ------ 配置 Kafka 集群

目录 配置 Kafka 集群配置步骤启动各Kafka节点 配置 Kafka 集群 启动命令&#xff1a; 1、启动 zookeeper 服务器端 小黑窗输入命令&#xff1a; zkServer 2、启动 zookeeper 的命令行客户端工具 &#xff08;这个只是用来看连接的节点信息&#xff0c;不启动也没关系&#…...

2024年全球网络安全预测报告

1.Gartner Gartners Top Strategic Predictions for 2024 and Beyond《Gartner顶级战略预测&#xff1a;2024年及未来》 https://www.gartner.com/en/articles/gartner-s-top-strategic-predictions-for-2024-and-beyond 2.IDC Top 10 Worldwide IT Industry 2024 Predict…...

Qt - QML与C++数据交互详解

文章目录 1 . 前言2 . Qml调用C的变量3 . Qml调用C的类4 . Qml调用C的方法5 . Qml接收C的信号6 . C接收Qml的信号&#xff08;在Qml中定义信号槽&#xff09;7 . C接收Qml的信号&#xff08;在C中定义信号槽&#xff09;8 . C调用Qml的函数9 . 总结 【极客技术传送门】 : https…...

Kettle Local引擎使用记录(一)(基于Kettle web版数据集成开源工具data-integration源码)

Kettle Web &#x1f4da;第一章 前言&#x1f4da;第二章 demo源码&#x1f4d7;pom.xml引入Kettle引擎核心文件&#x1f4d7;java源码&#x1f4d5; controller&#x1f4d5; service&#x1f4d5; 其它&#x1f4d5; maven settings.xml &#x1f4d7;测试&#x1f4d5; 测试…...

Java--业务场景:在Spring项目启动时加载Java枚举类到Redis中(补充)

文章目录 前言步骤测试结果 前言 通过Java–业务场景&#xff1a;在Spring项目启动时加载Java枚举类到Redis中,我们成功将Java项目里的枚举类加载到Redis中了&#xff0c;接下来我们只需要写接口获取需要的枚举值数据就可以了&#xff0c;下面一起来编写这个接口吧。 步骤 在…...

WPF 基础入门(资源字典)

资源字典 每个Resources属性存储着一个资源字典集合。如果希望在多个项目之间共享资源的话&#xff0c;就可以创建一个资源字典。资源字段是一个简单的XAML文档&#xff0c;该文档就是用于存储资源的&#xff0c;可以通过右键项目->添加资源字典的方式来添加一个资源字典文件…...

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑电氢耦合和碳交易的电氢能源系统置信间隙鲁棒规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这标题涉及到一个复杂的能源系统规划问题&#xff0c;其中考虑了电氢耦合、碳交易和置信间隙鲁棒规划。以下是对标题各个部分的解读&#xff1a; 电氢耦…...

ubuntu设定时间与外部ntp同步

前言 在 Ubuntu 上&#xff0c;你可以通过配置 systemd-timesyncd 服务来与外部 NTP 服务器同步系统时间。下面是设置的步骤&#xff1a; 安装 NTP 工具&#xff1a; 如果你的系统中没有安装 ntpdate 工具&#xff0c;可以使用以下命令安装&#xff1a; sudo apt-get updat…...

DataFrame详解

清洗相关的API 清洗相关的API: 1.去重API: dropDupilcates 2.删除缺失值API: dropna 3.替换缺失值API: fillna 去重API: dropDupilcates dropDuplicates(subset):删除重复数据 1.用来删除重复数据,如果没有指定参数subset,比对行中所有字段内容,如果全部相同,则认为是重复数据,…...

控制障碍函数(Control Barrier Function,CBF) 三、代码

三、代码实现 3.1、模型 这是一个QP问题&#xff0c;所以我们直接建模 这其实还是之前的那张图&#xff0c;我们把这个大的框架带入到之前的那个小车追击的问题中去&#xff0c;得到以下的一些具体的约束条件 CLF约束 L g V ( x ) u − δ ≤ − L f V ( x ) − λ V ( x ) …...

哈希表-散列表数据结构

1、什么是哈希表&#xff1f; 哈希表也叫散列表&#xff0c;哈希表是根据关键码值(key value)来直接访问的一种数据结构&#xff0c;也就是将关键码值(key value)通过一种映射关系映射到表中的一个位置来加快查找的速度&#xff0c;这种映射关系称之为哈希函数或者散列函数&…...

C# 强制类型转换和as区别和不同使用场景

文章目录 1.强制类型转换2. as 运算符3.实例总结&#xff1a; 在C#中&#xff0c;as 和 强制类型转换&#xff08;例如 (T)value&#xff09;的主要区别在于它们处理类型转换不成功时的行为和适用场景&#xff1a; 1.强制类型转换 使用语法&#xff1a;Type variable (Type)…...

什么是 DDoS 攻击

布式拒绝服务 (DDoS) 攻击是一种恶意尝试,通过大量互联网流量淹没目标或其周围基础设施,从而破坏目标服务器、服务或网络的正常流量。 DDoS 攻击通过利用多个受感染的计算机系统作为攻击流量源来实现有效性。被利用的机器可以包括计算机和其他网络资源。 从高层来看,DDoS 攻…...

c++隐式类型转换与explicit

我们知道&#xff0c;一个float与int做运算时&#xff0c;系统会首先个int类型转换为float类型之后再进行运算&#xff0c;这种隐式类型转换也会发生在类中 看以下例子&#xff0c;定义一个类 class myTime { public:int Hour;myTime() {};myTime(int h) :Hour(h) {}; }; 在…...

BERT Intro

继续NLP的学习&#xff0c;看完理论之后再看看实践&#xff0c;然后就可以上手去kaggle做那个入门的project了orz。 参考&#xff1a; 1810.04805.pdf (arxiv.org) BERT 论文逐段精读【论文精读】_哔哩哔哩_bilibili (强推!)2023李宏毅讲解大模型鼻祖BERT&#xff0c;一小时…...

“To-Do Master“ GPTs:重塑任务管理的趣味与效率

有 GPTs 访问权限的可以点击链接进行体验&#xff1a;https://chat.openai.com/g/g-IhGsoyIkP-to-do-master 部署私人的 To-Do Master 教程&#xff1a;https://github.com/Reborn14/To-Do-Master/tree/main 引言 在忙碌的日常生活中&#xff0c;有效地管理日常任务对于提高生…...

npm安装vue,添加淘宝镜像

如果是第一次使用命令栏可能会遇到权限问题。 解决vscode无法运行npm和node.js命令的问题-CSDN博客 安装 在vscode上面的导航栏选择terminal打开新的命令栏 另外可能会遇到网络或者其他的问题&#xff0c;可以添加淘宝镜像 npm install -g cnpm --registryhttps://registry.…...

LeetCode 2707. 字符串中的额外字符

一、题目 1、题目描述 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff0c;每个子字符串都在 dictionary 中出现过。s 中可能会有一些 额外的字符 不在任何子字符串中。 请你采取最优策略分割 s &#xff…...

Js进阶31-DOM 操作专题

1. JavaScript 的组成部分&#xff1a; ECMAScript&#xff1a;简称 ES&#xff0c;它是欧洲计算机协会&#xff0c;大概每年的六月中旬定制语法规范。DOM&#xff1a;全称 Document Object Model&#xff0c;即为文档对象类型。BOM&#xff1a;全称 Browser Object Model&…...

Hive之set参数大全-4

F 指定在使用 FETCH 命令提取查询结果时的序列化/反序列化器 hive.fetch.output.serde 是 Hive 的一个配置参数&#xff0c;用于指定在使用 FETCH 命令提取查询结果时的序列化/反序列化器。 以下是一个示例&#xff1a; -- 设置 hive.fetch.output.serde 为 org.apache.had…...

竞赛保研 基于深度学习的人脸识别系统

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…...

9.建造者模式

文章目录 一、介绍二、代码三、实际使用总结 一、介绍 建造者模式旨在将一个复杂对象的构建过程和其表示分离&#xff0c;以便同样的构建过程可以创建不同的表示。这种模式适用于构建对象的算法&#xff08;构建过程&#xff09;应该独立于对象的组成部分以及它们的装配方式的…...

简单的MOV转MP4方法

1.下载腾讯的QQ影音播放器, 此播放器为绿色视频播放器, 除了播放下载好的视频外没有臃肿无用功能 官网 QQ影音 百度网盘链接&#xff1a;https://pan.baidu.com/s/1G0kSC-844FtRfqGnIoMALA 提取码&#xff1a;dh4w 2.用QQ影音打开MOV文件 3.右下角打开影音工具箱 , 选择截取…...

YOLOv8改进 | Neck篇 | 利用ASF-YOLO改进特征融合层(适用于分割和目标检测)

一、本文介绍 本文给大家带来的改进机制是ASF-YOLO(发布于2023.12月份的最新机制),其是特别设计用于细胞实例分割。这个模型通过结合空间和尺度特征,提高了在处理细胞图像时的准确性和速度。在实验中,ASF-YOLO在2018年数据科学竞赛数据集上取得了卓越的分割准确性和速度,…...

基于模块自定义扩展字段的后端逻辑实现(一)

目录 一&#xff1a;背景介绍 二&#xff1a;实现过程 三&#xff1a;字段标准化 四&#xff1a;数据存储 五&#xff1a;数据扩展 六&#xff1a;表的设计 一&#xff1a;背景介绍 最近要做一个系统&#xff0c;里面涉及一个模块是使用拖拉拽的形式配置模块使用的字段表…...

力扣:18.四数之和

一、做题链接&#xff1a;18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 二、题目分析 1.做这一道题之前本博主建议先看上一篇《三数之和》 2.题目分析 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重…...

.netcore 6 ioc注入的三种方式

1、定义接口 public interface MyInterceptorInterface 2、实现接口 public class MyInterceptorImpl : MyInterceptorInterface 在构造中增加以下代码&#xff0c;便于观察 static ConcurrentDictionary<string, string> keyValues new ConcurrentDictionary<s…...

Python轴承故障诊断 (十)基于VMD+CNN-Transfromer的故障分类

目录 1 变分模态分解VMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 故障VMD分解可视化 3 基于VMDCNN-Transformer的轴承故障诊断分类 3.1 定义VMD-CNN-Transformer分类网络模型 3.2 设置参数&#xff0c;训练模型 3.3 模型评估 代码、数据如下&#xff1a…...

红河个旧网站建设/2019年度最火关键词

本周&#xff0c;Android 11 Beta正式推送&#xff0c;第一时间&#xff0c;Pixel 2系列及以上“亲儿子”机型率先达成升级。不过&#xff0c;紧接着&#xff0c;多款国产安卓手机也宣布开放或即将开放升级&#xff0c;经不完全统计&#xff0c;目前已经有小米10、小米10 Pro、…...

58同城做网站的电话/百度网站网址是多少

一、思维导图 二、代码 /这样无形中就会让代码很丑陋&#xff0c;使用if let 与guard let守护时必须是可选类型的if x ! nil && y ! nil {print("x或y都不等于空")}print("x或y有一个为空")//1 使用??let name:String? "我最帅"let …...

四川省住房与建设厅网站/四川seo哪里有

Windows 8图标 Windows系列图标演变 Windows 1.0图标 Windows 3.1图标 Windows XP图标 Windows Vista图标 新浪科技讯 北京时间2月18日凌晨消息&#xff0c;微软(微博)日前发布了Windows 8的标志&#xff0c;此举彰显了微软打算破釜沉舟&#xff0c;突显创新的决心&#xff0c;…...

上海专业网站建设价格低/西安网站seo服务

先概括一下飞流有四个特点。 第一&#xff0c;释放用户&#xff0c;减少用户开发成本&#xff0c;所以说这个系统是不需要用户编程&#xff0c;只需要登录个网页&#xff0c;点点配置一下&#xff0c;然后等下&#xff0c;数据就出来了。这是很重要的一个点&#xff0c;也是我们…...

wordpress 插件官网/世界最新新闻

ABB机器人发生不一致路径精确性故障维修描述&#xff1a;ABB机器人的TCP路径出现不一致&#xff0c;会导致其经常变化&#xff0c;并且伴有轴承、变速箱及其他位置的噪音发出&#xff0c;直接的后果就是导致机器人无法正常进行生产。ABB机器人发生不一致路径精确性故障维修原因…...

网站如何制作浙江/网站秒收录工具

初学Oracle,了解了一下Oracle的存储过程&#xff0c;运行了几个例子&#xff0c;做个备忘&#xff0c;方便以后使用&#xff1a;1、插入数据&#xff1a;向一张表里插入若干条数据/*创建表tb1包含两个字段col1、col2*/create table tb1(col1 char(20),col2 char(20));/*插入数据…...