力扣:单调栈算法思路题
单调栈分为单调递增栈和单调递减栈,通过使用单调栈我们可以访问到最近一个比它大(小)的元素。
🍊 单调递增栈:单调递增栈就是从栈底到栈顶数据是依次递增,通常是寻找某方向第一个比它小的元素。
🍊 单调递减栈:单调递减栈就是从栈底到栈顶数据是依次递减,通常是寻找某方向第一个比它大的元素。
适用场景
🍋什么情况适合用单调栈来解决实际问题呢?
🍒 通常是在数组中需要通过比较前后元素的大小关系来找最近的比它大(小)的元素问题时,可以使用单调栈进行求解。
场景示例
1:寻找左边第一个小于它的数
/*** 寻找左边第一个小于它的数* 单调递增栈:单调递增栈就是从栈底到栈顶数据是依次递增,通常是寻找某方向第一个比它小的元素* 单调递减栈:单调递减栈就是从栈底到栈顶数据是依次递减,通常是寻找某方向第一个比它大的元素** 题目描述: 给定一个长度为 n ≤ 10 ^5 的数组 a,输出每个数左边第一个比它小的数,如果不存在则输出 − 1。** 在指针 i 从左往右遍历的过程中,我们可以用一个栈来保存 i 左边的所有元素(不包括i指向的元素)* ,下标越大的元素越接近栈顶,下标越小的元素越接近栈底。* 每次我们访问栈顶,只要栈顶元素大于等于 a [ i ],我们就将栈顶元素弹出,直至栈顶元素小于 a [ i ] ,* 此时输出栈顶元素并将 a [ i ] 压入栈中。 由于栈中保存了 i 左边的所有元素,所以只要有答案,则答案一定在栈中。* 由于每个元素一定会被压入一次且至多弹出一次,因此操作次数至多是2n,故总时间复杂度为O(n)* @param array* @return*/public static int[] findFirstLeftLower(int[] array){Deque<Integer> linkList = new LinkedList<>();int[] ans = new int[array.length];for (int i = 0; i < array.length; i++) {// 如果栈不为空且当前数小于等于栈顶元素,则将栈顶出栈,并通过linkList.push(array[i])将当前元素入栈while(!linkList.isEmpty() && array[i] <= linkList.peek()){// 如果是求右边第一个大于它的数,只需要替换成 array[i] >= linkList.peek()linkList.poll();}if(!linkList.isEmpty()){// 由于栈顶元素存放第一个比当前元素小的数,则取出并给结果数组赋值ans[i] = linkList.peek();}else{ans[i] = -1;}linkList.push(array[i]);}/* for (int i = 0; i < ans.length; i++) {System.out.print(ans[i]+" ");}*/return ans;}
2:寻找左边第一个小于它的数的下标
/*** 寻找左边第一个小于它的数的下标* 单调递增栈:单调递增栈就是从栈底到栈顶数据是依次递增,通常是寻找某方向第一个比它小的元素* 单调递减栈:单调递减栈就是从栈底到栈顶数据是依次递减,通常是寻找某方向第一个比它大的元素** 题目描述: 给定一个长度为 n ≤ 10 ^5 的数组 a,输出每个数左边第一个比它小的数的下标,如果不存在则输出 − 1。* 我们只需要注意几个点,在当前条件下,咱们栈中存的是下标,而不是值,* 所以需要修改两个地方:* a[linkList.peek()] 而不是linkList.peek(),* 不再是a[i],而是存储对应的下标i* @param array* @return*/public static int[] findFirstLeftLowerPosition(int[] array){Deque<Integer> linkList = new LinkedList<>();int[] ans = new int[array.length];for (int i = 0; i < array.length; i++) {// 如果栈不为空且当前数小于等于栈顶元素,则将栈顶出栈,并通过linkList.push(array[i])将当前元素入栈while(!linkList.isEmpty() && array[i] <= array[linkList.peek()]){// 如果是求右边第一个大于它的数的下标,只需要替换成 array[i] >= linkList.peek()linkList.poll();}if(!linkList.isEmpty()){// 由于栈顶元素存放第一个比当前元素小的数 对应下标,则取出并给结果数组赋值ans[i] = linkList.peek();}else{ans[i] = -1;}linkList.push(i);}/*for (int i = 0; i < ans.length; i++) {System.out.print(ans[i]+" ");}*/return ans;}
3:LeetCode 42. 接雨水
/*** LeetCode 42. 接雨水* 给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排序的柱子,下雨后能接多少雨水。* @param height* @return*/public static int trapWater(int[] height) {Deque<Integer> linkList = new LinkedList<>();// 总雨水量int ans = 0;int n = height.length;for (int i = 0; i <n ; i++) {// 当前柱子作为右柱子,栈顶元素作为中间柱,中间柱子前面作为左柱,只能接左右两柱最低柱子高度的水while(!linkList.isEmpty() && height[linkList.peek()] <= height[i]){// 右柱比栈顶更高,才能接水。否则的话,就是满足单调递减栈的,那么我们继续入栈。int top = linkList.pop();// 拿出前一个柱子if(linkList.isEmpty()){// 如果这根柱子后,前面没有元素,那就接不了雨水了,因为接雨水的话,至少需要左右两边都有柱子才行。break;}// 记录一下拿到的这根柱子的左边那根柱子的高度int left = linkList.peek();// 根据柱状图推算宽度int currWidth = i-left-1;int currHeight = Math.min(height[left],height[i]) - height[top];ans += currHeight*currWidth;}linkList.push(i);//经过上面一顿操作之后,咱们的栈又满足单调性了,于是将当前元素的下标入栈。}return ans;}
参考资料
单调栈图文详解
相关文章:
力扣:单调栈算法思路题
单调栈分为单调递增栈和单调递减栈,通过使用单调栈我们可以访问到最近一个比它大(小)的元素。 🍊 单调递增栈:单调递增栈就是从栈底到栈顶数据是依次递增,通常是寻找某方向第一个比它小的元素。 …...
11 月 25 日 ROS 学习笔记——3D 建模与仿真
文章目录 前言一、在 ROS 中自定义机器人的3D模型1. 在 rviz 里查看3D模型2. xacro 二、Gazebo1. urdf 集成 gazebo2. 综合应用1). 运动控制及里程计2). 雷达仿真3). 摄像头信息仿真4). kinect 深度相机仿真5). 点云 前言 本文为11 月 25 日 ROS 学习笔记——3D 建模与仿真&am…...
MidJourney笔记(3)-Prompts
MidJourney的Prompts介绍 MidJourney的Prompts是MidJourney的核心之一,这也是我们后续使用MidJourney过程中最重要的工作内容,根据生成的图片,不断的优化我们的Prompts内容。 那Prompts的中文意思是提示的意思。 Prompts的提示语有很多,最基础的用法就是: /imagine prompt…...
贪心 D. Least Cost Bracket Sequence
Problem - D - Codeforces 题目大意:给一个只包含(,),?三个字符的字符串。每个?可以转为(或者),对于第 i i i个?转为(需要花费 a i a_i ai,转为)需要花费 b i b_i bi。现在问能否让该字符串转为合法的括号匹配…...
iOS APP包分析工具 | 京东云技术团队
介绍 分享一款用于分析iOSipa包的脚本工具,使用此工具可以自动扫描发现可修复的包体积问题,同时可以生成包体积数据用于查看。这块工具我们团队内部已经使用很长一段时间,希望可以帮助到更多的开发同学更加效率的优化包体积问题。 工具下载…...
在 VSCode 中使用 GDB 进行 C/C++ 程序调试(图文版)
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...
任意文件读取漏洞理解
任意文件读取漏洞理解 1. 漏洞描述: 任意文件读取漏洞是指攻击者可以利用漏洞读取系统上的任意文件,包括敏感信息的配置文件、用户数据甚至系统文件,从而获取未经授权的访问权限。 2. 漏洞原理: 这种漏洞通常是由程序处理用户输入…...
linux 安装yum
问题1:File "/usr/libexec/urlgrabber-ext-down", line 28 except OSError, e: ^ 问题2:yum File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: ^ vim /usr/…...
数学启发式
学习资料: 优化求解器 | Gurobi 数学启发式算法:参数类型与案例实现 数学启发式算法 | 可行性泵 (Feasibility Pump)算法精讲:一份让您满意的【理论介绍编程实现数值实验】学习笔记(PythonGurobi实现) 大佬到底是大佬!这些资料太…...
Win10/Win11 使用Wsl的Ubuntu 子系统搭建CGO环境,相当于Ubuntu下开发。GO环境CGO搭建,支持交叉编译
背景: 之前是使用Mac 开发,最近切换到win11下面。发现使用cgo编译有问题。 下面记载了我的使用方法。 环境: win11(win10理论一样) win11 安装了wsl2的环境,并且安装了ubuntu系统。 在win11 上面安装了g…...
CSS新特性(2-2)
CSS新特性(2-2) 前言box相关box-shadow background背景rgba颜色与透明度transform:rotate(Xdeg) 2D旋转transform:tranlate 平移 前言 本文继续讲解CSS3其他的新特性,想看之前新特性点击这里,那么好本文正式开始。 box相关 box…...
为什么,word文件在只读模式下,仍然能编辑?
Word文档设置了只读模式,是可以编辑的,但是当我们进行保存的时候就会发现,word提示需要重命名并选择新路径才能够保存。 这种操作,即使可以编辑文字,但是原文件是不会受到影响的,编辑之后的word文件会保存到…...
29 - 装饰器模式:如何优化电商系统中复杂的商品价格策略?
开始今天的学习之前,我想先请你思考一个问题。假设现在有这样一个需求,让你设计一个装修功能,用户可以动态选择不同的装修功能来装饰自己的房子。例如,水电装修、天花板以及粉刷墙等属于基本功能,而设计窗帘装饰窗户、…...
逆矩阵相关性质与例题
1.方阵的行列式:就是将方阵中的每一个元素转换至行列式中。 1.性质一:转置方阵的行列式等于转置前的行列式。(对标性质:行列式与它的转置行列式相等) 2.性质二:|ka||a|*k的n次方,n为方阵阶数。 …...
Ruoyi项目传List到后台并使用Excel模板下载数据的方法以及遇到的各种前后端数据交互问题
import { download } from @/utils/requestconst app = createApp(App)// 全局方法挂载 app.config.globalProperties.download = download 首先因为ruoyi-ui中的main.js有配置如上全局注册: 因此只需要在vue中定义一个方法直接使用this.download调用下载即可: (download的3…...
区块链技术将如何影响未来的数字营销?
你是否听腻了区块链和数字营销等流行语,却不明白它们对未来意味着什么?那么,准备好系好安全带吧,因为区块链技术将彻底改变我们对数字营销的看法。从建立消费者信任到提高透明度和效率,其可能性是无限的。 让我们来探…...
小程序wx:if和hidden的区别?
wx:if:wx:if 是一个完整的条件渲染指令,当它的表达式为真时,才会渲染该指令所在的元素。如果表达式的值为假,则不会渲染该元素。这意味着在表达式为假时,该元素及其子元素都不会被渲染,就像它们从未存在过一…...
分布式幂等
分布式幂等 在分布式系统、网络通信和数据库操作中,幂等性是一个非常重要的概念,特别是在面对可能发生网络故障、消息重复、或者系统崩溃等情况时。 举个简单的例子,考虑一个银行转账的操作。如果转账操作是幂等的,那么无论你执…...
大数据 DataX-Web 详细安装教程
目录 一、DataX-Web 介绍 1.1 DataX-Web 是什么 1.2 DataX-Web 架构 二、DataX-Web 安装部署 2.1 环境要求 2.2 安装 2.3 部署 2.4 数据库初始化 2.5 配置 2.6 启动服务 2.6.1 一键启动所有服务 2.6.2 一键取消所有服务 2.7 查看服务(注意!…...
CSS3媒体查询实现不同宽度的下不同内容的展示
文章目录 前言CSS3 多媒体查询实例520 到 699px 宽度 - 添加邮箱图标700 到 1000px - 添加文本前缀信息大于 1001px 宽度 - 添加邮件地址大于 1151px 宽度 - 添加图标代码后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:CSS ὃ…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
