一文解决单调栈的应用

单调栈的定义:

单调栈是栈的一中特殊形式,在栈中的元素必须满足单调性(一定是单调上升或单调下降等等的规律)。


单调栈的性质:

  • 单调栈解决的问题

单调栈解决的常见问题:给定一个序列,求每个位置左边,离他最近且小于他的数的位置。
我们可以这样理解单调栈:
既然我们必须让元素满足单调性,那么每次插入就和栈顶作比较。
如果不满足某些性质,直接弹出栈顶,直到栈为空或满足该性质插入这个元素。


  • 如何维护一个单调栈

单调递增栈:在保持栈内元素单调递增的前提下(如果栈顶元素大于要入栈的元素,将将其弹出),将新元素入栈。
单调递减栈:在保持栈内元素单调递减的前提下(如果栈顶元素小于要入栈的元素,则将其弹出),将新元素入栈。


  • 单调栈的规律

在这里插入图片描述
在这里插入图片描述


单调栈练习题汇总

  • 已解决

    1 模拟单调栈
    2 leetocde T84柱形图中的最大矩形

  • 未完待续

模拟单调栈

  • 分析

本题是单调栈的模板题,可以用数组模拟单调栈,但是我个人更喜欢用Stack集合调用API的方式。

  • 代码
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] q = new int[n + 1];Stack<Integer> stk = new Stack<>();for(int i = 0; i < n; i++) q[i] = sc.nextInt();for(int i = 0; i < n; i++) {while(!stk.empty() && q[stk.peek()] >= q[i]) stk.pop();if(stk.empty()) System.out.print("-1 ");else System.out.print(q[stk.peek()] + " ");stk.push(i);}}
}

柱形图中的最大矩形

  • 题目分析:

本题中在该柱状图中,求能够勾勒出来的矩形的最大面积这个问题,可以模拟样例,想一想如何解决这个面积问题?
首先对于面积,需要底×高,高度跟每个柱子的高度有关,底和对应柱子的下标有关系。正确的思路是枚举每个柱子的高度,以这个高度向左右两边进行扩展,如果能找到当前柱子左右两边的离他最近且小于他的高度的柱子,那么这个柱子所能构成的最大矩形面积就是用当前的柱子的高度h[i] * (right[i] - left[i] - 1)

为什么要减1?
right[i] - left[i]:这是从 left[i]right[i] 之间的距离,但这包括了left[i]right[i] 本身。
我们真正关心的是柱子 i 左边和右边,第一个小于它的柱子之间的距离,所以不包括 left[i] right[i],而是 left[i] right[i] 之间的元素个数。因此,要在 right[i] - left[i] 的基础上再减去 1。
举例:
假设 heights = [2, 1, 5, 6, 2, 3],我们考察柱子i = 2(即高度为 5 的柱子):
left[2] = 1:在 heights[2] 左边,第一个小于 5 的柱子在索引 1。
right[2] = 4:在 heights[2] 右边,第一个小于 5 的柱子在索引 4。
所以 right[2] - left[2] - 1 = 4 - 1 - 1 = 2。
这表示柱子 i = 2 的宽度为 2(包括自己)时,高度为 5 的矩形面积最大。因此,面积为 heights[2] * (right[2] - left[2] - 1) = 5 * 2 = 10

  • 代码
class Solution {public int largestRectangleArea(int[] heights) {int n = heights.length;Stack<Integer> stk = new Stack<>();int[] left = new int[n + 1];int[] right = new int[n + 1];for(int i = 0; i < n; i++) {while(!stk.empty() && heights[stk.peek()] >= heights[i]) stk.pop();if(stk.empty()) left[i] = -1;else left[i] = stk.peek();stk.push(i); }stk.clear();// 维护当前元素的右边比自己小的最近的数的下标 for(int i = n - 1; i >= 0; i--) {while(!stk.empty() && heights[stk.peek()] >= heights[i]) stk.pop();if(stk.empty()) right[i] = n;else right[i] = stk.peek();stk.push(i);}int ans = 0;for(int i = 0; i < n; i++) {ans = Math.max(ans, heights[i] * (right[i] - left[i] - 1));}return ans;}
}

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

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

相关文章

.NET 8 中的 Mini WebApi

介绍 .NET 8 中的极简 API 隆重登场&#xff0c;重新定义了我们构建 Web 服务的方式。如果您想知道极简 API 的工作原理以及它们如何简化您的开发流程&#xff0c;让我们通过一些引人入胜的示例来深入了解一下。 .NET 极简主义的诞生 想想我们曾经不得不为一个简单的 Web 服务…

Java静态代理设计模式深度解析:原理、应用及实现

全文目录&#xff1a; 开篇语前言摘要概述源码解析1. 定义公共接口2. 创建实际业务类3. 创建代理类 使用案例分享案例&#xff1a;权限校验功能 应用场景案例优缺点分析优点缺点 核心类方法介绍测试用例小结总结文末 开篇语 哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&…

大数据选型对比追命连环50问及参考答案

在面试时,考官很喜欢问选型的问题,考察面试者知识广度和深度。因为在实际企业开发项目,选型是很关键的一步,如果选错了,挖的坑可能要大量的时间去填了。特别是出现严重问题需要重新选择大数据组件,就意味着要推倒重来。。。而老板是不喜欢这种没产出的投入。 目录 详细…

Linux——常见指令及其权限理解(正在更新中)

1.指令 1.1 快速了解指令 pwd 首次登录&#xff0c;默认所处的路径 whoami 当前所用的用户的名称 ls 显示当前路径下&#xff0c;文件名称 mkdir 在当前目录下&#xff0c;创建一个文件夹/目录 cd 进入一个目录 touch 新建一个文…

esp32 GPIO 分别用5种中断类型控制LED

下面程序分别用ANYEDGE POSEDGE NEGEDGE HIGH_LEVEL LOW_LEVEL 中断类型控制GPIO 0 脚的电平。此程序的重点是用延时消除按键产生的无用中断信号 硬件 1. led 接0脚和地 2. 按钮接gpio 1脚 和地或3.3v 脚 图片 程序 #include "driver/gpio.h" #incl…

ansible开局配置-openEuler

ansible干啥用的就不多介绍了&#xff0c;这篇文章主要在说ansible的安装、开局配置、免密登录。 ansible安装 查看系统版本 cat /etc/openEuler-latest输出内容如下&#xff1a; openeulerversionopenEuler-24.03-LTS compiletime2024-05-27-21-31-28 gccversion12.3.1-30.…

金蝶云星空采购退料单集成易仓出库单实现高效数据对接

金蝶云星空采购退料单集成易仓出库单实现高效数据对接 Done-金蝶-采购退料单——>易仓-出库单&#xff1a;高效数据集成方案解析 在企业的日常运营中&#xff0c;数据的准确传递和实时处理至关重要。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何将金蝶云星空中…

基于Ubuntu24.04,下载并编译Android12系统源码 (二)

1. 前言 上篇文章&#xff0c;我们基于Ubuntu24.04&#xff0c;已经成功下载下来了Android12的源码&#xff0c;这篇文章我们会接着上文&#xff0c;基于Ubuntu24.04来编译Android源码。 2. 编译源码 2.1 了解源码编译的名词 Makefile &#xff1a; Android平台的一个编译系…

CMake 生成器表达式介绍

【写在前面】 生成器表达式在构建系统生成期间进行评估&#xff0c;以生成特定于每个构建配置的信息。它们的形式为 $<...>。例如&#xff1a; target_include_directories(tgt PRIVATE /opt/include/$<CXX_COMPILER_ID>) 这将扩展为 “/opt/include/GNU”、“/opt…

CV项目整理

1. 爬取+展示的实时项目 1.1 核心技术 myqls + maxwell + redis+django 实现读写分离,实时项目,主从复制,读写分离,顺写日志。 maxwell将自己伪装成为slave,就可以从Mysql的集群中获取顺写日志Binlog maxwell取得的数据格式json 1.2 流程 1.3优化查询 下面的查询,笛卡尔…

如何通过sip信令以及抓包文件分析媒体发到哪个地方

前言 问题描述&#xff1a;A的媒体没转发到B&#xff0c;B只能听到回铃音&#xff0c;没有A的说话声音&#xff0c;并且fs这边按正常的信令发送了. 分析流程 分析早期媒体发送到哪一个IP 10.19.0.1发送了一个请求给10.19.0.157这个IP&#xff0c;然而这里的SDP媒体地址&am…

Flink(一)

目录 架构处理有界与无界数据部署应用到任意地方运行任意规模应用利用内存性能 流应用流处理应用的基本组件流状态时间 应用场景事件驱动应用事件驱动应用的优势Flink如何支持事件驱动应用&#xff1f; 典型的事件驱动示例 数据分析应用流式分析应用的优势&#xff1f;Flink 如…

RabbitMQ 安装(Windows版本)和使用

安装 安装包获取 可以自己找资源&#xff0c;我这里也有百度云的资源&#xff0c;如果没失效的话可以直接用。 通过百度网盘分享的文件&#xff1a;RabbitMQ 链接&#xff1a;https://pan.baidu.com/s/1rzcdeTIYQ4BqzHLDSwCgyw?pwdfj79 提取码&#xff1a;fj79 安装教程…

Pr 视频效果:闪光灯

视频效果/风格化/闪光灯 Stylize/Strobe Light 闪光灯 Strobe Light效果可用于在视频中创建闪烁或频闪的效果&#xff0c;类似于舞台上的频闪灯或摄影中的闪光灯。 ◆ ◆ ◆ 效果选项说明 通过调整各种参数&#xff0c;可以自定义闪光的颜色、频率、持续时间和混合模式&#…

深入理解ThreadLocal底层原理

ThreadLocal是线程私有的&#xff0c;各个线程之间是隔离的。可以想象一下每次线程创建的时候在堆上预先分配一个内存空间用于存储ThreadLocal的数据。 &#xff08;1&#xff09;当线程被创建时&#xff0c;线程都会有一个成员变量ThreadLocalMap。 //每个线程定义一个成员变…

GCC之编译(7)Linker链接脚本

GCC之(7)Linker链接脚本 Author: Once Day Date: 2024年10月25日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 本文档翻译自GNU LD链接脚本官方手册 参考文章: GNU LD …

OpenCV中的坐标运算 [C#]

在C#语言中&#xff0c;可以使用OpenCV库进行坐标运算&#xff0c;包括平移、缩放、点到点的距离和点到线的距离。 从Nuget下载 OpenCvSharp4.Windows 下面是一些示例代码&#xff1a; 点到点的距离&#xff1a; using OpenCvSharp;/// <summary> /// 点到点距离 /// …

windows命令汇总

windows命令汇总 1. 查看注册表的值 reg query “HKLM\Software\YourSoftwareKey” /v YourValueName 举例 reg query “HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters” /v MaxUserPort reg query “HKEY_LOCAL_MACHINE\SYSTEM\Current…

构建自然灾害预警决策一体化平台,筑牢工程安全数字防线

近年来&#xff0c;国家和部委也强调了要切实加强地质灾害监测预警。作为国内智慧应急领域的先行者&#xff0c;Mapmost持续探索利用数字孪生技术&#xff0c;推进自然灾害风险预警精细化&#xff0c;强化对监测数据的综合分析和异常信息研判处置。建立健全区域风险预警与隐患点…

Redis中Lua脚本的使用场景

Redis 中的 Lua 脚本可以用于多种场景&#xff0c;以下是一些常见的使用场景及其对应的 Java 实现示例。 通过使用 Lua 脚本&#xff0c;可以在 Redis 中实现复杂的逻辑和原子操作&#xff0c;同时利用 Java 客户端&#xff08;如 Spring Data Redis&#xff09;方便地执行这些…