【算法】-单调队列

news2024/11/15 19:49:04

目录

什么是单调队列

区域内最大值

区域内最小值


什么是单调队列

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

        其内部元素在队列内维持单调特性(递增或递减),类似单调栈,但是与单调栈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 := 0
    for 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.coloradmin.cn/o/2134097.html

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

相关文章

Python精选200Tips:126-130

Those who know are not as good as those who love, and those who love are not as good as those who enjoy 126 PyInstaller - 将 Python 程序打包成独立可执行文件的工具示例:图像变为灰度图像项目结构代码文件打包步骤运行可执行文件127 PyYAML - YAML 解析和生成工具示…

【机器学习(六)】分类和回归任务-LightGBM算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;Histogram&#xff08;二&#xff09;GOSS1、信息增益2、近似误差 &#xff08;三&#xff09;EFB 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、LightGBM分类任务实现对比&a…

计算机毕业设计 财会信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【机器学习(四)】分类和回归任务-梯度提升决策树(GBDT)-Sentosa_DSML社区版

文章目录 一、算法概念一、算法原理&#xff08;一&#xff09; GBDT 及负梯度拟合原理&#xff08;二&#xff09; GBDT 回归和分类1、GBDT回归1、GBDT分类二元分类多元分类 &#xff08;三&#xff09;损失函数1、回归问题的损失函数2. 分类问题的损失函数&#xff1a; 三、G…

ThreeJS入门(002):学习思维路径

查看本专栏目录 - 本文是第 002篇入门文章 文章目录 如何使用这个思维导图 Three.js 学习思维导图可以帮助你系统地了解 Three.js 的各个组成部分及其关系。下面是一个简化的 Three.js 学习路径思维导图概述&#xff0c;它包含了学习 Three.js 的主要概念和组件。你可以根据这个…

CSP-J 之计算机基本结构

文章目录 前言计算机的宏观结构计算机的微观结构硬件部分软件部分 计算机硬件系统介绍主存储器与辅助存储器1. 主存储器&#xff08;Main Memory&#xff09;2. 辅助存储器&#xff08;Secondary Storage&#xff09;Cache&#xff08;缓存&#xff09;总线&#xff08;Bus&…

Java 行为型设计模式一口气讲完!*^____^*

Java 责任链模式 Java设计模式 -责任链模式 责任链模式为请求创建一个接收者对象列表。 这种模式是行为模式。 当使用责任链模式时&#xff0c;通常每个接收器包含对另一个接收器的引用。 如果一个对象不能处理请求&#xff0c;则它将相同的对象传递给下一个接收者&#xf…

vue的路由

v2用3版本&#xff0c;v3用4版本 import Vue from vue import VueRouter from vue-router Vue.use(VueRouter) const routes [] const router new VueRouter({ routes }) export default router import Vue from vue import App from ./App.vue import router from /router V…

【漏洞复现】科荣AIO moffice Sql注入漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

应用案例分享 | 智驾路试数据分析及 SiL/HiL 回灌案例介绍

概述 为有效利用海量的路试数据并发挥其价值&#xff0c;经纬恒润推出了OrienLink路试数据分析及开环/闭环回灌测试系统。该系统采用统一的数据存储标准平台&#xff0c;基于云计算技术提供的大规模存储、高带宽和高算力&#xff0c;能够对路试数据进行深入的场景挖掘。通过软件…

AI小项目4-用Pytorch从头实现Transformer(详细注解)

目录 一、前期准备工作学习如何读AI论文读Transformer原始论文用Pytorch从头实现Transformer 二、我的完整代码实现1.导入库2.基本组件创建词嵌入位置嵌入自注意力 3.编码器4.解码器5.完整架构6.简单测试一下代码创建模型和准备简单的训练数据训练一次&#xff08;前向传播&…

用Python实现时间序列模型实战——Day 20: 时间序列预测的综合练习

一、学习内容 在本节中&#xff0c;我们将综合应用前几周学习的时间序列分析与预测方法&#xff0c;完成一个完整的时间序列预测项目&#xff0c;包含从数据预处理、异常检测、模型选择、预测到评估的全流程。项目流程&#xff1a; 1. 数据获取与预处理 数据加载&#xff0c…

023.PL-SQL进阶—视图

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

跨越日语障碍2024轻松实现日语阅读的好帮手

不知道你喜欢看日本小说吗&#xff0c;之前的东野奎吾还有不少日本作家的书籍&#xff0c;如果想看一手的书籍那就只能看日语版本的啦。但是因为语言的问题日语不是很好的小伙伴阅读起来就有一定的难度。今天我就介绍几个日语翻译工具来解决这个问题咯。 1.福昕在线翻译 链接…

简单了解 JVM

目录 ♫什么是JVM ♫JVM的运行流程 ♫JVM运行时数据区 ♪虚拟机栈 ♪本地方法栈 ♪堆 ♪程序计数器 ♪方法区/元数据区 ♫类加载的过程 ♫双亲委派模型 ♫垃圾回收机制 ♫什么是JVM JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模…

网络安全培训班有用吗

在当今数字化时代&#xff0c;网络安全问题日益凸显&#xff0c;成为了全球关注的焦点。随着网络攻击的不断升级和复杂化&#xff0c;越来越多的人开始关注网络安全&#xff0c;并考虑参加网络安全培训班来提升自己的技能。那么&#xff0c;网络安全培训班到底有用吗? 一、网络…

如何彻底清除电脑上的数据?保护你的隐私安全

随着科技的飞速发展&#xff0c;电脑已经成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;当我们需要更换电脑、出售旧电脑或处理废旧电脑时&#xff0c;如何彻底清除电脑上的数据成为了一个重要的问题。本文将详细介绍几种彻底清除电脑数据的方法&#xff0c;以确保…

无人机应用新纪元:图形工作站配置推荐与硬件解析

低空经济作为国家新兴的战略性产业&#xff0c;正逐步成为经济高质量发展的新动力。据统计&#xff0c;2023年中国低空经济规模达到5059.5亿元&#xff0c;增速为33.8%&#xff0c;预计到2026年有望突破万亿元大关。政府对低空经济的发展高度重视&#xff0c;不仅出台了相关法规…

IPv6路由基础

RIPng RIPng是一种较为简单的内部网关协议&#xff0c;是RIP在IPv6网络中的应用。RIPng主要用于规模较小的网络中&#xff0c;比如校园网以及结构较简单的地区性网络。由于RIPng的实现较为简单&#xff0c;在配置和维护管理方面也远比OSPFv3和IS-IS for IPv6容易&#xff0c;因…

腾讯地图SDK Android版开发 11 覆盖物示例 4 线

腾讯地图SDK Android版开发 11 覆盖物示例 4 线 前言线的属性介绍ColorType 和 LineTypeColorTypeLineType 与颜色有关的属性填充色和线宽描边颜色和描边的宽度分段颜色渐变色擦除颜色 与纹理相关属性内置纹理自定义颜色纹理线上叠加纹理 虚线 界面布局MapPolyline类常量成员变…