力扣:单调栈算法思路题

单调栈分为单调递增栈和单调递减栈,通过使用单调栈我们可以访问到最近一个比它大(小)的元素。

🍊 单调递增栈:单调递增栈就是从栈底到栈顶数据是依次递增,通常是寻找某方向第一个比它小的元素。
🍊 单调递减栈:单调递减栈就是从栈底到栈顶数据是依次递减,通常是寻找某方向第一个比它大的元素。

适用场景
🍋什么情况适合用单调栈来解决实际问题呢?
🍒 通常是在数组中需要通过比较前后元素的大小关系来找最近的比它大(小)的元素问题时,可以使用单调栈进行求解。

场景示例
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;}

参考资料
单调栈图文详解

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

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

相关文章

ESP32自定义OTA实现

ESP32 自定义实现OTA 一 相关头文件二 OTA流程三 初始化过程四 OTA过程注意事项 一 相关头文件 //----------------------------// OTA #include "esp_ota_ops.h" #include "esp_app_format.h" #include "esp_flash_partitions.h" #include &qu…

物联网后端个人第十二周总结

学习工作进度 物联网方面 1.模拟设备通过规则引擎将数据通过mqtt进行转发 在物联网平台上实现模拟设备通过规则引擎将数据通过mqtt进行转发已经全部完成了&#xff0c;所使用的物联网平台在这方面有不少的问题和bug&#xff0c;也可能是没有按照开发者的想法对平台进行使用才导…

MATLAB在信号系统中的应用

1.产生一个幅度为1, 基频为2Hz&#xff0c;占空比为50%的周期方波.要求画出图形。 在MATLAB中&#xff0c;函数square(w0*t, DUTY)产生基本频率为w0 (周期T2*pi/w0)、占空比DUTY (τ/T)*100的周期矩形波&#xff08;方波&#xff09;&#xff0c;默认情况下占空比DUTY50。占空…

如何理解2023vivo开发者大会,使用Rust语言编写蓝河操作系统(BlueOS)?

在2023年vivo开发者大会上&#xff0c;vivo宣布使用Rust语言编写其蓝河操作系统&#xff08;BlueOS&#xff09;。 什么是Rust语言&#xff1f; Rust 是一种开放源代码系统编程语言&#xff0c;可用于开发高效、安全的软件。 使用 Rust 可管理内存并控制其低级详细信息。 但你…

微信小程序显示二维码?

wxml <canvas style"width: 100%;height: 100%;margin-left: 20%;" id"Canvase" type"2d"></canvas> js // pages/code/code.js Page({/*** 页面的初始数据*/data: {code: ,},/*** 生命周期函数--监听页面加载*/onLoad(options) {…

LLM之Agent(一):使用GPT-4开启AutoGPT Agent自动化任务完整指南

在ChatGPT引领的大模型时代&#xff0c;要想让大模型按照用户的指令执行&#xff0c;Prompt设计是一门艺术&#xff0c;由此还催生了一个职业”Prompt工程师“。其实&#xff0c;并不是所有人都可以设计出好的Prompt&#xff0c;甚至同样的Prompt应用在不同的大模型上表现的结果…

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训

大数据技术之数据安全与网络安全——CMS靶场(文章管理系统)实训 在当今数字化时代&#xff0c;大数据技术的迅猛发展带来了前所未有的数据增长&#xff0c;同时也催生了对数据安全和网络安全的更为迫切的需求。本篇博客将聚焦于大数据技术背景下的数据安全与网络安全&#xff…

扫描条形码到电脑:Barcode to pc 4.6.3 Crack

像专业人士一样使用条形码将条形码发送到 PC 排名第一的智能手机扫描应用程序 将条形码即时发送到计算机程序并自动执行任务的最简单方法 受到全球 500,000 多名用户的信赖 条形码到 PC&#xff1a;Wi-Fi 扫描仪应用程序&#xff0c;条码到 PC&#xff1a;适用于 Android 和 i…

MidJourney笔记(3)-Prompts

MidJourney的Prompts介绍 MidJourney的Prompts是MidJourney的核心之一,这也是我们后续使用MidJourney过程中最重要的工作内容,根据生成的图片,不断的优化我们的Prompts内容。 那Prompts的中文意思是提示的意思。 Prompts的提示语有很多,最基础的用法就是: /imagine prompt…

【Web】[GKCTF 2021]easycms

直接点击登录按钮没有反应 扫目录扫出来/admin.php 访问 弱口令admin 12345直接登录成功 点开设计--主题--自定义 编辑页头&#xff0c;类型选择php源代码 点保存显示权限不够 设计--组件--素材库 先随便上传一个文件&#xff0c;之后改文件名称为../../../../../system/tmp…

一些可能被忽视的 Vue3 API 附带案例

Vue3 是 Vue.js 的最新版本&#xff0c;它引入了许多新的 API 和改进。以下是一些可能被忽视的 Vue3 API&#xff1a; reactive&#xff1a;这是 Vue3 中用于创建响应式对象的函数。与 Vue2 中的 data 不同&#xff0c;reactive 返回的对象是响应式的&#xff0c;这意味着当对…

JsonRPC协议详解(协议介绍、请求示例、响应示例)

JsonRPC协议详解 什么是RPC&#xff1f; RPC&#xff08;远程过程调用&#xff09;是一种用于实现分布式系统中不同进程或不同计算机之间通信的技术。它允许我们像调用本地函数一样调用远程计算机上的函数&#xff0c;使得分布式系统的开发变得更加简单和高效。 什么是JsonRP…

python之pycryptodome模块,加密算法库

一、简介 PyCryptodome是PyCrypto库的一个分支&#xff0c;它是Python中最受欢迎的密码学库之一。PyCryptodome提供了许多密码学算法和协议的实现&#xff0c;包括对称加密、非对称加密、消息摘要、密码哈希、数字签名等。它还提供了一些其他功能&#xff0c;如密码学安全随机…

Deepin使用记录-deepin系统下安装RabbitMq

目录 0、引言 1、由于RabbitMq是erlang语言开发的&#xff0c;所有需要先安装erlang 2、更新源并安装RabbitMq 3、安装完成之后&#xff0c;服务是启动的&#xff0c;可以通过以下语句查看状态 4、这样安装完成之后&#xff0c;是看不到web页面的&#xff0c;需要再安装一…

MySQL数据库——存储函数(介绍、案例)

目录 介绍 案例 介绍 存储函数是有返回值的存储过程&#xff0c;存储函数的参数只能是IN类型的。具体语法如下&#xff1a; CREATE FUNCTION 存储函数名称 ([ 参数列表 ]) RETURNS type [characteristic ...] BEGIN-- SQL语句RETURN ...;END ; characteristic说明&#xf…

[修订版][工控]SIEMENS S7-200 控制交通红绿灯程序编写与分析

下载地址>https://github.com/MartinxMax/Siemens_S7-200_Traffic_Light 特别鸣谢接线过程实验目的题目要求I/O分配公式公式套用示例 程序分析分割块[不是必要的,自己分析用]左侧梯形图 [B1-B5]B1 [东西绿灯亮25s]B2 B3 B23 [东西绿灯闪烁3s]B4 [东西黄灯亮2s]B5 [东西红灯…

物联网AI MicroPython学习之语法 实时时钟RTC

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; RTC 介绍 模块功能: 实时时钟RTC驱动模块 接口说明 RTC - 构建RTC对象 函数原型&#xff1a;RTC()参数说明&#xff1a; 无 返回值&#xff1a; 构建的RTC对象。 datetime - RTC时钟操作 函数原型&a…

CleanMyMac X4.14.5Crack最新Mac电脑清理优化最佳应用

CleanMyMac X 4.14.5是用于清理和优化Mac的最佳应用程序和强大工具。它看起来很棒而且很容易理解。该软件可以清理、保护、优化、稳定和维护您的 Mac 系统。您可以立即删除不必要的、不寻常的、无用的垃圾文件、损坏的文件垃圾&#xff0c;并释放大量内存空间。此外&#xff0c…

一键提取随机画面为JPG图片,实现高效剪辑

你是否曾经在观看视频时&#xff0c;遇到了一些精彩瞬间&#xff0c;却无法将其保存下来&#xff1f;现在&#xff0c;我们为你带来了一款全新的工具——视频批量剪辑&#xff0c;一键提取随机画面为JPG图片&#xff0c;让你可以轻松留住这些精彩瞬间&#xff01; 首先&#xf…

工具及方法 - 查找排名:国内网络作家排名

中国十大网络小说作家排名&#xff0c;在买购网的排名&#xff1a; 中国十大网络小说作家 网络小说作家排行榜 中国著名网络写手排名→MAIGOO生活榜 &#xff08;这个网站里还有很多其他的排名。&#xff09; 1&#xff0c;唐家三少 2&#xff0c;辰东 3&#xff0c;我吃西红…