单调栈练习(二)— 柱状图中最大的矩形

题目:
这是一道LeetCode上的原题:链接地址
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
在这里插入图片描述

思路
因为是力扣原题,所以这道题省略了暴力解和对数器的过程,直接用单调栈的方法写完跑力扣。

整体思路是:遍历数组并维护一个栈底 -> 栈顶是由小到大的单调栈结构。当栈顶元素被弹出后,进行结算。
结算的方式是,以当前弹出元素作为整个矩阵的高,左右向外扩,找到左侧最近且小和右侧最近且小的数作为边界。囊括的中间部分就是以当前高度所形成的矩阵大小。
遍历一遍,以arr[] 中每个数字都作为一次矩阵的高。求max即可。

代码

解释下代码:
cur:是你当前在单调栈中弹出来的数,是满足的上面 if(当前数比栈顶数小) 条件才弹出来的。
所以右侧边界就是当前的 i 。
左侧边界就是弹出后的单调栈的栈顶元素(没有则为-1)。
所以以当前cur为整个矩阵的统一高度,求此时有多少个数。

最后的while,当数组遍历完后,如果栈中不为null,则直接循环弹出栈中元素。
此时,因为数组已经为null,所以不会再有值使栈顶元素弹出,所以右侧没有比当前栈顶元素小的值了。此时栈中剩余元素完全符合由小到大的规则。
所以此时右侧囊括到arr.length。
左侧如果有值,则为左侧最近且小的范围,如果没有,则到 -1。
再次比较大小即可。

public int largestRectangleArea(int[] heights) {if (heights == null || heights.length == 0) {return 0;}Stack<Integer> stack = new Stack<>();Integer max = Integer.MIN_VALUE;for (int i = 0; i < heights.length; i++) {while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {Integer cur = stack.pop();Integer leftMin = stack.isEmpty() ? -1 : stack.peek();max = Math.max(max, (i - leftMin - 1) * heights[cur]);}stack.push(i);}while (!stack.isEmpty()){Integer cur = stack.pop();Integer leftMin = stack.isEmpty() ? -1 : stack.peek();max = Math.max(max, (heights.length - leftMin - 1) * heights[cur]);}return max;}

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

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

相关文章

Copilot 插件的使用介绍:如何快速上手

GitHub Copilot 本文主要介绍如何通过脚本工具激活 GitHub Copilot 插件&#xff0c;提供安装及激活图文教程&#xff0c;大家按下面操作即可激活GitHub Copilot插件&#xff0c;免费使用Ai编码工具 一、GitHub Copilot 介绍 GitHub Copilot 是由 GitHub 和 OpenAI 共同开发的…

49寸OLED拼接屏:技术、应用与市场前景

作为“49寸OLED拼接屏”技术总监&#xff0c;我深知这一产品对于显示行业的重要性。随着显示技术的不断进步&#xff0c;OLED拼接屏在高端显示市场占据了一席之地。下面&#xff0c;我将从技术的角度深入剖析这一产品。 一、参数 49寸OLED拼接屏是一款高端大屏显示产品&#x…

大数据Doris(五十二):SQL函数之数学函数

文章目录 SQL函数之数学函数 一、abs(double a)

海外社媒运营为什么需要选择优质IP代理?

跨境电商卖家尤其需要关注海外社媒运营&#xff0c;想要更好地运营Instagram、Facebook、TikTok 或 Twitter等&#xff0c;挖掘社媒潜力需要采取战略方法&#xff0c;而社交媒体IP代理在这一活动中发挥着至关重要的作用&#xff0c;下面为你详细介绍。 一、社交媒体代理IP及其运…

Prometheus Blackbox_exporter笔记

一、安装Promtheus 在 Prometheus 官网 Download | Prometheus 获取适用于 Linux 的 Prometheus 安 装包&#xff0c;这里我选择最新的 2.46.0 版本&#xff0c;我是 Linux 系统&#xff0c;选择下载 prometheus-2.46.0.linux-amd64.tar.gz 下载安装包&#xff1a; wget htt…

JS 作用域和预解析

作用域 通常来说&#xff0c;一段程序代码中所用到的名字并不总是有效和可用的&#xff0c;而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性&#xff0c;增强了程序的可靠性&#xff0c;减少了名字冲突。 作用域分为全局作用域和局…

Win10 自带微软输入法怎么切换成简体字 快捷鍵是什么?

环境&#xff1a; Win10专业版 问题描述&#xff1a; 微軟輸入法怎麽切換中文簡體 快捷鍵&#xff0c;之前不小心按了快捷键 解决方案&#xff1a; 1.按CtrlShiftF快捷键转换简体字或繁体字 2.可以在“设置-时间和语言-区域和语言-语言-中文&#xff08;中华人民共和国&a…

最全最详细ChatGPT预设词Prompt教程

使用指南 1、可直复制使用 2、可以前往已经添加好Prompt预设的AI系统测试使用&#xff08;可自定义添加使用&#xff09; https://ai.sparkaigf.com 雅思写作考官 我希望你假定自己是雅思写作考官&#xff0c;根据雅思评判标准&#xff0c;按我给你的雅思考题和对应答案给我…

小H靶场笔记:DC-6

DC-6 January 6, 2024 12:06 PM Tags: nmap提权&#xff0c;WordPress Owner&#xff1a;只惠摸鱼 信息收集 apr-scan和nmap探测主机后&#xff0c;发现靶机ip&#xff1a;192.168.199.136&#xff0c;端口22和80开放 扫描端口服务、版本、操作系统、默认脚本扫描 扫描开…

CMake入门教程【核心篇】动态库与静态库的差别

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1.概述2.动态库(Shared Libraries)主要特点使用场景3.静态库(Static Libraries)主要特点

权威报告|得帆信息入选甲子光年《2023信创软件品牌影响力研究报告》

近日&#xff0c;国内知名科技产业智库甲子光年发布了《2023信创软件品牌影响力研究报告》&#xff0c;报告全面、深度探究了信创软件的发展历程与现状&#xff0c;讨论主要驱动力的变化&#xff0c;以及国内软件厂商在国内市场的品牌影响力&#xff0c;并寻找当前信创落地遇到…

【无标题】PDF编辑软件哪个好用?4款PDF编辑器分享!

PDF编辑软件哪个好用&#xff1f;在我们的日常办公中&#xff0c;编辑PDF文件是非常方便的一项功能。通过编辑PDF&#xff0c;我们可以对文档进行修改和调整&#xff0c;添加或删除内容&#xff0c;以及进行格式和布局的更改。这样&#xff0c;我们可以更好地符合我们的需求和要…