LeetCode84(柱状图中最大的矩形)理解单调栈

news2024/9/19 9:36:54

1. LeetCode84(柱状图中最大的矩形)

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

输入: heights = [2,4]
输出: 4

提示:

  • 1 <= heights.length <=10^5
  • 0 <= heights[i] <= 10^4

如题意描述,要取最大的矩形面积,那么得找到宽度与高度相乘的最大值.

但我们先思考几个情形,在这张图上什么样能构成矩形

  • 长和宽都得规则,也就是只能是水平扩展,不能是不规则的扩展.
  • 对于每一个柱形,他自己本身也是一个矩形.

基于以上的描述,接下来我们就得找到构成矩形的长宽,从何处取.

对于每一个柱形,我们得先选取一个基准.什么叫基准呢,就是以这个柱子的高度,去找寻能够凑成与这个柱子构成的矩形.

可能还是很模糊,我们举具体的例子来说明:

  • 例如我们来查看索引1处这个柱子

以他为基准,我们想要尽可能的扩展这个矩形,那么说明什么?我们需要找到左边第一个比他小的柱子高度与右边比他小的第一个柱子的高度.

为什么呢,为什么水平扩展就得去要找到比他小的值呢?

因为第一个比他小的说明,只能扩展在这个索引处,不能再往左或者右方向扩展.

如果没找到呢,说明能够完全扩展到左右两端,例如此时的1.左右两端都没有出现比他小的高度,所以以他为基准.所构成的矩形面积大小为 1 * 6 = 6.

所以关键点出来了,我们得找到在左边第一个比此时柱子小的高度,与第一个右边比此时柱子小的高度.

所以我们此时才会想到单调栈,单调栈的使用场景就有我们需要找到第一个比他小或者大的数.

那问题来了,栈里面是调递增呢,还是递减呢

注意:

  • 要找第一个比他小的,栈里面递减
  • 要找第一个比他大的,栈里面递增

所以我们的栈里面是单调递减的.这样我们再来解释一下,如何从这样一个单调栈中找到第一个比此时柱子高度小的值.

  • 对于柱子右边来讲,我们很好理解,遇见比此时栈顶元素(这个栈顶元素也就是我们之前提到的基准)小的数时,说明此时遇到基准第一个小的值(从左往右遍历的,遇见一个比他小的肯定就是第一个比他小的)
  • 而对于右边的第一个最小值呢?实际上就是基准从栈弹出后的下一个栈顶元素,别忘了栈里面是单调递减的,所以弹出当前栈顶元素,下一个栈顶一定是小于等于上一个的栈顶元素.

这样我们就能找到左边第一个与右边第一个比他小的值,那怎么计算这样的宽度呢?

我们观察一下 5 6 2这一段柱子

对于我们这样的算法思想,当遍历到2时,此时他是小于栈顶元素6的.所以我们要触发计算过程.

宽度如何确认呢?注意我们单调栈中存的应该是数组中的下标,我们再通过下标找到数组具体的值,相当于做了一个映射.

所以依照我们的思想

基准: mid = stack.pop()          //此时应该是3(下标,对应就是数组中的6)

第一个左边比他小的值: left = stack.peek()     //是2(下标,对应就是数组中的5)

第一个右边比他小的值: right = i       //就是此时遍历到数组的下标(对应数组中的2)

这样一看,对于此时基准6而言,左右都不能扩展,此时算出的矩形面积应该就是他自己本身构成的矩形

面积为: height[mid] * (right - left - 1) 

这样我们就得到了面积的计算公式.

此时我们考虑情况完了吗?

并没有,假设此时有这样一个数组: [1,3,6,7,9]

我们会发现数组本身就是单调的,这样按照我们之前的思路,会导致全部存入栈中,而没有产生计算.那我们如何去触发计算呢?

实际上我们在尾部填上一个0就可以啦,因为0肯定是小于数组中的元素(题目说了值大于等于0),这样就会触发我们的计算过程.

那这样就万无一失了吗?还不够,我们再试想一个数组:[9,7,6,3,1]

对于这样一个数组,在遇见7时,我们会把9弹出,但再去找栈顶元素时,栈中已经没有了值,所以我们获取不到,导致算法过程不能正常执行.所以此时我们还需要来往数组前添加一个0,来确保我们的计算逻辑的一致性.

所以整体代码为:

class Solution {
    public int largestRectangleArea(int[] heights) {
        LinkedList<Integer> stack = new LinkedList();
        int max = 0;
        //后补0为了能够触发计算的操作,前补0为了整个计算逻辑
        int[] height = new int[heights.length + 2];
        for(int i = 1,j = 0;i < height.length - 1;j++,i++){
            height[i] = heights[j];
        }
        for(int i = 0;i < height.length;i++){
            while(!stack.isEmpty() && height[stack.peek()] > height[i]){
                //mid代表基准
                int mid = stack.pop();
                //left代表左边第一个比基准小的索引值,也就是以当前基准能够扩展到左边的哪个位置
                int left = stack.peek();
                //right代表右边第一个比基准小的索引值,也就是以当前基准能够扩展到右边的哪个位置
                int right = i;
                max = Math.max(max,height[mid] * (right - left - 1));
            }
            stack.push(i);
        }
        return max;
    }
}

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

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

相关文章

大模型时代,什么样的算法工程师更吃香?

毫无疑问&#xff0c;全栈型的算法工程师将更为抢手&#xff0c;如果你精通大模型从训练到应用的整个流程&#xff0c;你走到哪里都不怕。 但往往人的精力有限&#xff0c;如果从数据、预训练、微调、对齐、推理、应用几个方面来看的话&#xff0c;个人觉得现在重要性排序是“…

python测试框架之Pytest

初识Pytest Pytest1.Pytest的特点&#xff1a;2.Pytest的基本使用规则3.pytest安装1&#xff09;使用编译器安装2&#xff09;使用命令安装 4.pytest规则 Pytest Pytest是python的一个第三方单元测试库&#xff0c;它的目的是让单元测试变得容易&#xff0c;并且也能扩展到支持…

同一个wifi不同电脑ip一样吗?网络ip地址怎么修改

‌在数字化时代&#xff0c;Wi-Fi已成为我们日常生活与工作中不可或缺的一部分&#xff0c;它让多台设备能够轻松接入互联网&#xff0c;实现信息共享与数据传输。然而&#xff0c;你是否曾好奇过&#xff0c;在同一个Wi-Fi网络下&#xff0c;不同电脑的IP地址是否会不一样&…

10个Python自动化日常任务实战脚本示例

小编准备入门了Python入门学习籽料80个Python入门实例 点击 领取&#xff08;无偿获得&#xff09; 1. 自动备份文件夹 目标 : 每天自动将指定文件夹的内容备份到另一个位置。 import shutil import datetime def backup_files(source, destination): """…

DevEcoStudio创建的默认工程HelloWorld build失败请问如何解决?

解决方法&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 确认当前登录的windows用户是否是Administrator&#xff0c;出现这种情况&#xff0c;大概率都是普通用户&#xff0c;所以造成权限不足的问题。一种解决办法是切换到Administrator用户再打开项目进行build。 如…

已拿证 | 2024深圳驾考科目四全攻略:技巧、知识点一网打尽

目录 _head 精简500题 区分变道和左转&#xff0c;变道手下垂&#xff0c;左转手伸直 紧急包扎需要柔软介质 网状线内禁止停车 会车千万不能开远光灯 只准直行 城3公4 城5公7 一急二反三连续 落水救援 驾驶陋习 车到路肩人在外 交警先看脸&#xff01;&#xff01…

Redis保姆级安装教程

下载:https://github.com/redis-windows/redis-windows/releases 然后就慢慢等待 下载完解压,打开 以管理员身份运行,这里一直按回车就可以了 复制路径 这里勾错了,是编辑 修改配置文件redis.conf 加这一行 以管理员身份运行cmd,输入redis-cli 在输入ping 再输入info 这样就完…

IP-RDS-222、IP-PRZ-59-AM12、EG-TRZ-42-L、EG-TRZ-42-H比例减压阀放大器

IP-DAR-250、IP-DAR-43C-L、IP-DAR-43C-H、IP-RDS-222、IP-PRZ-59-AM12、EG-TRZ-42-L、EG-TRZ-42-H比例减压阀 EE-PRB、EE-PRD比例压力阀 EE-P2G、ET-P2S、EB-P2A、EE-P2A、ET-P2A、EE-P2H、EG-F2A、EU-F2A比例流量阀 EF-F3G、EU-F3G比例压力补偿流量阀 EQ-S4M、EG-S4M、EQ…

【JAVA CORE_API】Day21 Map接口、在线聊天室v3.0、Java的反射机制(P1)

Map接口 Map接口 Map是Java中用于存储键值对&#xff08;key-value pairs&#xff09;的接口&#xff0c;每个键&#xff08;key&#xff09;对应一个值&#xff08;value&#xff09;。它不允许重复的键&#xff0c;但允许不同的键映射相同的值。 关键特点&#xff1a; 键值…

Linux 可视化管理工具:宝塔面板(BT)

&#x1f600;前言 在 Linux 系统的运维管理中&#xff0c;命令行界面&#xff08;CLI&#xff09;是主要的操作方式。然而&#xff0c;对于许多系统管理员或开发者来说&#xff0c;使用 CLI 进行管理和维护任务并不总是最直观或最方便的方式。为了简化操作并提高效率&#xff…

【注解】反序列化时匹配多个 JSON 属性名 @JsonAlias 详解

JsonAlias 注解是 Jackson 提供的一个功能强大的注解&#xff0c;允许一个字段在反序列化时匹配多个 JSON 属性名。它适用于在处理多种输入数据格式时&#xff0c;或当 JSON 数据的键名可能变化时。 一、JsonAlias 的作用 多种别名&#xff1a;JsonAlias 允许你为一个字段定义…

利用深度学习技术来实现街景图像的语义分割(街景图像语义分割)

本项目致力于利用深度学习技术来实现街景图像的语义分割。通过精确地识别和分类图像中的每个像素&#xff0c;该技术能够自动划分出街道、人行道、车辆、行人等各种不同的物体类别。这在智能交通系统、自动驾驶、城市规划等领域有着广泛的应用前景。 技术实现 深度学习模型&am…

网站上线流程完全手册:域名、服务器与CDN

网站上线的核心要点 需要买域名 域名备案(国内) 买服务器 把服务器IP和域名(网址)绑定 把本地网站代码文件上传到服务器上 我来先来了解下以上的概念 域名介绍 域名是网站的地址&#xff0c;类似于你的家在街上的位置。它让人们通过简单的名字&#xff08;如 www.baidu.…

大模型时代的AI应用开发,可以不用,但必须会

成熟的“格子衫”和年轻的“脸庞”&#xff0c;与开发者有关的大会总是少不了这两种元素&#xff0c;Create 2024百度AI开发者大会也不例外。 过去几十年&#xff0c;层出不穷的编程语言、框架等新技术&#xff0c;把一代又一代年轻的脸庞&#xff0c;塑造为成熟的格子衫&…

网络安全威胁2024年中报告

近日&#xff0c;奇安信威胁情报中心发布《网络安全威胁2024年中报告》&#xff0c;内容涵盖高级持续性威胁&#xff08;APT&#xff09;、勒索软件、互联网黑产、漏洞利用等几方面。 APT攻击活动&#xff1a;2024 年上半年&#xff0c;APT 攻击主要集中在信息技术、政府、科研…

设计模式笔记07(java版)

文章目录 迭代器模式定义结构优缺点使用场景迭代器模式在JDK源码中的使用 访问者模式定义结构案例实现优缺点使用场景扩展1. 分派&#xff1a;2. 动态分派&#xff1a;3. 静态分派&#xff1a;4. 双分派&#xff1a; 备忘录模式概述定义结构“黑箱”备忘录模式优缺点使用场景 解…

递归神经网络 (RNN) 简介

文章目录 一、介绍二、什么是递归神经网络 &#xff08;RNN&#xff09;&#xff1f;三、展开递归神经网络四、训练递归神经网络五、RNN 的类型六、现实生活中的 RNN 用例七、RNN 的两个主要限制八、RNN的变体8.1 双向递归神经网络 &#xff08;BRNN&#xff09;8.2 长短期记忆…

色彩的含义和使用色彩象征的艺术

无论你走到哪里&#xff0c;你都能看到颜色&#xff1a;天空中的白云&#xff0c;绿色的植被逐渐上升&#xff0c;灰色的石头结构和红砖建筑&#xff0c;在你脚下磨砺着棕色的土壤。你不只是看到这些颜色......你感觉到它们。 一&#xff0c;颜色的含义从何而来&#xff1f; 熟…

华为OD算法题整理目录

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

面试搜狐大模型算法工程师,体验真棒!!!

搜狐大模型算法工程师面试题 应聘岗位&#xff1a;搜狐大模型算法工程师 面试轮数&#xff1a; 整体面试感觉&#xff1a;偏简单 面试过程回顾 1. 自我介绍 在自我介绍环节&#xff0c;我清晰地阐述了个人基本信息、教育背景、工作经历和技能特长&#xff0c;展示了自信和沟通…