【算法】-单调队列

目录

什么是单调队列

区域内最大值

区域内最小值


什么是单调队列

        说到单调队列,其实就是一个双端队列, 顾名思义,单调队列的重点分为「单调」和「队列」。「单调」指的是元素的「规律」——递增(或递减)。「队列」指的是元素只能从队头和队尾进行操作。

        其内部元素在队列内维持单调特性(递增或递减),类似单调栈,但是与单调栈FILO不同的是队列的FIFO的特性,配合滑动窗口的思想,可以解决区间内最值的问题。


区域内最大值

        例题:239. 滑动窗口最大值 - 力扣(LeetCode)

        我们来简单分析一下,题目要求的是滑动窗口内最大值,也就是区间内的最大值。这时候如果我们用暴力解法,维护一个双指针的滑窗和窗口内最大值,当窗口右移时,我们要比较新加入元素与窗口内最大值,选择是否更新。

        如果是更新最大值的情况还好办,但是我们设想一下不理想的情况,新加入的元素不比窗口最大值大,同时移出窗口的元素恰恰是窗口最大值!那么这样一来,区间内的最大值是什么呢?这是没办法直接得出的,在这里还要遍历整个窗口重新寻找窗口最大值,太浪费时间了。

        这时候用单调队列就能很好的解决问题,因为队列元素的单调性,使得获取最值和维护更新最值的操作自然一体。单调队列在入队时,比较来判断加入后会不会破坏单调性,不会则加入,会就出队原来的元素直到加入后满足单调性,这一行为可以抽象为滑动窗口滑的过程,同时还有注意根据题意在窗口大小k范围更新记录答案。

        总的来说,单调队列就是以下3个步骤:

  1. 入(元素进入队尾,同时维护队列单调性
  2. 出(元素离开队首
  3. 记录/维护答案(根据队首
func maxSlidingWindow(nums []int, k int) []int {ans := make([]int, 0, len(nums)-k+1) // 预先分配好空间q := []int{}for i, x := range nums {// 1. 入for len(q) > 0 && nums[q[len(q)-1]] <= x {q = q[:len(q)-1] // 维护 q 的单调性}q = append(q, i) // 入队// 2. 出if i-q[0] >= k { // 队首已经离开窗口了q = q[1:] // Go 的切片是 O(1) 的}// 3. 记录答案if i >= k-1 {// 由于队首到队尾单调递减,所以窗口最大值就是队首ans = append(ans, nums[q[0]])}}return ans
}

区域内最小值

        例题:2398. 预算内的最多机器人数目 - 力扣(LeetCode)

        题目要求机器人连续运行,看成一个连续子数组,题目要求计算最长子数组长度。枚举子数组右端点 right,我们需要知道此时左端点 left 的最小值,这样子数组尽量长。

        由于有 budget 的限制,所以 right 越大,left 也越大,有单调性,可以用滑动窗口解决。套路如下:

  1. 入:chargeTimes[right] 进入窗口时,弹出队尾的 ≤chargeTimes[right] 的元素。
  2. 出:如果总开销超过 budget,则不断移出左端点,直到总开销不超过 budget。特别地,如果左端点恰好等于队首,则弹出队首。
  3. 更新答案:用窗口长度 right−left+1 更新答案的最大值。

        注意:为了方便判断队首是否要出队,单调队列中保存的是下标。

func maximumRobots(chargeTimes, runningCosts []int, budget int64) (ans int) {q := []int{}sum := int64(0)left := 0for right, t := range chargeTimes {// 1. 入for len(q) > 0 && t >= chargeTimes[q[len(q)-1]] {q = q[:len(q)-1]}q = append(q, right)sum += int64(runningCosts[right])// 2. 出for len(q) > 0 && int64(chargeTimes[q[0]])+int64(right-left+1)*sum > budget {if q[0] == left {q = q[1:]}sum -= int64(runningCosts[left])left++}// 3. 更新答案ans = max(ans, right-left+1)}return
}

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

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

相关文章

电脑提示丢失mfc140u.dll的详细解决方案,mfc140u.dll文件是什么

遇到电脑显示“缺少 mfc140u.dll 文件”的错误其实是比较常见的。这种提示通常表示某个应用程序在尝试运行时未能找到它所需的关键 DLL 文件&#xff0c;导致无法正常启动。不过&#xff0c;别担心&#xff0c;本文将一步步引导你通过几种不同的方法来解决这个问题&#xff0c;…

树模式数据表设计学习

引子&#xff1a; 场景&#xff1a;某读书网站&#xff0c;支持读者评论文章&#xff0c;并且对评论支持回复功能。设计的表如下&#xff1a; 问题点&#xff1a;你想获取一个评论下所有的评论信息&#xff1f; 将所有评论一次性取出、轮巡遍历&#xff0c;获取到所有数据。 …

多人开发小程序设置体验版的痛点

抛出痛点 在分配任务时,我们将需求分为三个分支任务,分别由前端A、B、C负责: 前端A: HCC-111-实现登录功能前端B: HCC-112-实现用户注册前端C: HCC-113-实现用户删除 相应地,我们创建三个功能分支: feature_HCC-111-实现登录功能feature_HCC-112-实现用户注册feature_HCC-1…

从C语言过渡到C++

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;C &#x1f3c5;往期回顾&#x1f3c6;&#xff1a;单链表实现&#xff1a;从理论到代码-CSDN博客&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱的博客-CSDN博客 目录 ​…

Golang | Leetcode Golang题解之第395题至少有K个重复字符的最长子串

题目&#xff1a; 题解&#xff1a; func longestSubstring(s string, k int) (ans int) {for t : 1; t < 26; t {cnt : [26]int{}total : 0lessK : 0l : 0for r, ch : range s {ch - aif cnt[ch] 0 {totallessK}cnt[ch]if cnt[ch] k {lessK--}for total > t {ch : s[…

cas单点登录流程揭密

前言 前几篇文章&#xff0c;经过大篇幅讲解了cas整合以及Cookie和Session。 springbootvue集成cas单点登录最详细避坑版讲解 关于cookie和session的直观讲解&#xff08;一&#xff09; 关于cookie和session的直观讲解&#xff08;二&#xff09; 那么&#xff0c;接下来&…

数据结构修炼——顺序表和链表的OJ题练习

目录 一、顺序表相关OJ题1 移除元素题目解析 2 合并两个有序数组题目解析 二、链表相关OJ题1 移除链表元素题目解析 2 反转链表题目解析 3 链表的中间结点题目解析 4 合并两个有序链表题目解析 5 链表的回文结构题目解析 6 相交链表题目解析 7 环形链表的判断题目解析 8 环形链…

OCR 通用端到端模型GOT

摘要 在人工智能领域&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术已经取得了显著的进展。随着技术的不断进步&#xff0c;我们正迈向OCR 2.0时代。本文将介绍由Vary团队开发的通用端到端模型GOT&#xff0c;这一模型在OCR领域具有革命性的潜力。 论文概览 论文…

水滴式多功能粉碎机:粉碎中草药的好帮手

水滴式中草药粉碎机&#xff0c;顾名思义&#xff0c;其设计灵感源自自然界中水滴的柔和与力量。它摒弃了传统粉碎机粗犷的粉碎方式&#xff0c;采用低速研磨技术&#xff0c;模拟水滴穿透岩石的细腻与持久&#xff0c;对中草药进行温和而深入的粉碎。这种技术不仅保留了药材中…

Unreal游戏初始化流程

前言 本文主要是总结Unreal在游戏启动时的初始化流程&#xff0c;包括讨论PIE和Standalone的区别&#xff0c;避免把一些初始化逻辑放在不合适的位置&#xff0c;比如我希望在所有Actor BeginPlay后执行某个逻辑&#xff0c;那我如果把它放在Subsystem的initialize中显然就会搞…

初阶数据结构【TOP】- 11.普通二叉树的介绍 - 1. (细致,保姆~~!)

文章目录 前言一、普通二叉树的链式结构二、 造树三、普通二叉树的遍历四、遍历完整代码五、总结 前言 本篇文章笔者将会对普通二叉树部分进行细致的讲解 , 本篇主要包括以下内容: 二叉树链式结构的介绍 ,二叉树的遍历. 笔者会一步一步分析带学者领略递归的美好~~ 一、普通二叉…

DPO: Direct Preference Optimization 介绍

DPO 是 RLHF 的屌丝版本&#xff0c;RLHF 需要加载 4 个模型&#xff08;2个推理&#xff0c;2个训练&#xff09;&#xff0c;DPO 只需要加载 2 个模型&#xff08;1个推理&#xff0c;一个训练&#xff09;。 RLHF&#xff1a; DPO&#xff1a; DPO 原理 DPO 的本质是监督对…

YoloV10 训练自己的数据集(推理,转化,C#部署)

目录 一、下载 三、开始训练 train.py detect.py export.py 超参数都在这个路径下 四、C#读取yolov10模型进行部署推理 如下程序是用来配置openvino 配置好引用后就可以生成dll了 再创建一个控件&#xff0c;作为显示 net framework 4.8版本的 再nuget工具箱里下载 …

价值流与核心理论框架对比解析:企业业务架构优化的全景指南

企业架构优化中的理论框架选择 随着数字化转型和全球竞争的加剧&#xff0c;企业管理者越来越意识到优化业务流程以提升竞争力的重要性。然而&#xff0c;在众多优化方法中&#xff0c;企业如何选择最适合自己的理论框架成为一大挑战。由The Open Group发布的《价值流指南》系…

密码学基础--ECDSA算法入门

目录 1.ECDSA签名长度的疑惑 2.ECDSA原理 2.1 生成签名 2.2 验签过程 2.3 签名编码问题 3.小结 1.ECDSA签名长度的疑惑 我们来看看ECDSA签名长什么样子&#xff0c;使用MuscleV02自动生成密钥对&#xff0c;并对message"0x11223344”进行签名&#xff0c;结果如下&a…

Java的衍生生态有哪些?恐怖如斯的JAVA

Java的衍生生态极其丰富&#xff0c;涵盖了多个层面和领域。以下是Java衍生生态的一些主要方面&#xff1a; 1. 开源工具 开发工具&#xff1a;如Eclipse&#xff0c;这是一款非常优秀的Java IDE工具&#xff0c;支持Java以及其他语言的代码编写。Spring官方还基于Eclipse开发…

Golang开发之路

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

混合整数规划及其MATLAB实现

目录 引言 混合整数规划的基本模型 混合整数规划的求解方法 MATLAB中的混合整数规划实现 示例&#xff1a;多变量系统的混合整数规划 表格总结&#xff1a;混合整数规划的求解方法与适用场景 结论 引言 混合整数规划&#xff08;Mixed Integer Programming, MIP&#xf…

多线程学习篇二:Thread常见方法

1. 常见方法 方法名 static 功能说明 注意点 start() 启动一个新线程&#xff0c;在新线程里面运行run方法 start 方法只是让线程进入就绪&#xff0c;里面代码不一定立刻运行(CPU 的时间片还没分给它)。每个线程对象的 start 方法只能调用一次&#xff0c;如果调用了多…

【Hadoop|MapReduce篇】MapReduce概述

1. MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序&#xff0c;并发运行在一个Hadoop集群上。 2. Map…