代码随想录算法训练营第六十三天| 84.柱状图中最大的矩形

题目与题解

 84.柱状图中最大的矩形

题目链接: 84.柱状图中最大的矩形

代码随想录题解: 84.柱状图中最大的矩形

视频讲解:单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形_哔哩哔哩_bilibili

解题思路:

        看答案,不为难自己

看完代码随想录之后的想法 

        重点还是怎么将应用题翻译成数学题,才能选择合适的做法。

        要求最大的矩形,其实就是以某一个最低高度为矩形的高,将其周围不小于它的高度的柱子宽度加在一起,作为矩形的宽。这样翻译过来,就是要求每一个高度左边和右边第一个高度小于它的下标,这样,左右下标之间的柱子就是矩形的宽度。

        与接雨水的题稍微有点反过来,略复杂了一些。

        1. 双指针法

        遍历两遍heights,分别计算其每个下标左边第一个高度小于它的下标minLeftIndex和每个下标右边第一个高度小于它的下标minRightIndex。为了提高计算效率,以计算左边下标为例,不需要逐一遍历其左边的所有数字中直到找到第一个下标,如果其左边某一个下标高度高于它,那直接取t = minLeftIndex[t]为当前最小下标即可,直到t < 0。为了防止死循环,minLeftIndex[0]初始化要赋值为-1。右边同理。

        求完这两个数组后,遍历0-size-1,求出每一个下标对应的最大矩阵大小为minRightIndex[i] - minLeftIndex[i]-1)*heights[i],最后取最大值即可。

class Solution {public int largestRectangleArea(int[] heights) {// 双指针int size = heights.length;int[] minLeftIndex = new int[size];minLeftIndex[0] = -1;for (int i = 1; i < size; i++) {int t = i-1;while (t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];minLeftIndex[i] = t;}int[] minRightIndex = new int[size];minRightIndex[size-1] = size;for (int i = size - 2; i >= 0; i--) {int t = i+1;while (t < size && heights[t] >= heights[i]) t = minRightIndex[t];minRightIndex[i] = t;}int res = heights[0];for (int i = 0; i < size; i++) {res = Math.max(res, (minRightIndex[i] - minLeftIndex[i]-1)*heights[i]);}return res;}
}

2. 单调栈

        这次的单调栈要变成栈底到栈顶从小到大排列的顺序了,因为要求的是更高的高度对应矩阵的面积。

        这样跟接雨水也很类似,如果当前height[i]大于height[s.peek()]直接入栈,如果相等就弹出一个再入栈一个,否则当栈不为空且height[i]小于height[s.peek()]时,循环计算当前矩形的高度mid = height[s.peek()]并弹出栈顶,如果此时栈不为空,就可以获得其左边第一个比它小的高度的下标s.peek()和右边第一个比它小的高度i,得到矩形宽为 i - s.peek() - 1,求得其面积。最后比较得到最大面积即可。

        这里需要注意,heights不能直接使用,要先在其前后加两个值0,生成新的矩阵。否则当当前数组是单调的时候,是无法进入计算其面积的循环里面的。

class Solution {public int largestRectangleArea(int[] heights) {// 单调栈Stack<Integer> s = new Stack<>();int[] newHeight = new int[heights.length+2];System.arraycopy(heights, 0, newHeight, 1, heights.length);s.push(0);int res = 0;for (int i = 1; i < newHeight.length; i++) {if (newHeight[i] > newHeight[s.peek()]) {s.push(i);} else if (newHeight[i] == newHeight[s.peek()]){s.pop();s.push(i);} else {while (!s.isEmpty() && newHeight[i] < newHeight[s.peek()]) {int mid = s.pop();if (!s.isEmpty()) {int w = i - s.peek() - 1;res = Math.max(res, w * newHeight[mid]);}}s.push(i);}}return res;}
}

遇到的困难

        应用题还是得知道怎么翻译。

        单调栈的细节也很多,容易写错。

今日收获

        最后一题单调栈,还是有点云里雾里,得再练。

        收工了!

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

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

相关文章

西汉两个韩信,结局怎么如此相似

西汉军事家、“汉初三杰”韩信是家喻户晓的人物&#xff0c;同时期还有一个韩信&#xff0c;也是战功赫赫&#xff0c;也被封王&#xff0c;史书为了区别&#xff0c;在后一个韩信名字之间加上一个“王”&#xff0c;称为韩王信。韩信是个光芒万丈的人物&#xff0c;韩王信也是…

WPF容器控件之WrapPanel、布局控件

WrapPanel: 换行panel 子元素进行换行&#xff0c;当子元素的宽度或者高度超出了父元素&#xff0c;才进行换行。高度超出父元素的高度 也会另起一列 属性 Orientation布局方式 实例 <WrapPanel Orientation"Horizontal"><Label>C# 是从 C/C 衍生出来的…

leetcode 并查集

朋友圈 班上有 N 名学生。其中有些人是朋友&#xff0c;有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友&#xff0c;B 是 C 的朋友&#xff0c;那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈&#xff0c;是指所有朋友的集合。 给定一个 N * N 的矩阵 M&…

活动回顾 |观测云 AI Agent 探索实践

亚马逊云科技“构建全球化软件和互联网新生态——ISV 行业”论坛上&#xff0c;观测云产品架构师刘锐发表了题为“AI Agent 可观测性探索与实践”的主题演讲&#xff0c;不仅展示了观测云在人工智能领域的前沿技术&#xff0c;更强调了在日益复杂的系统环境中&#xff0c;实现有…

LeetCode738:单调递增的数字

题目描述 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 332 代码 class Solution { public:int monotoneIncreasingDigits(…

AI日报:干翻AI PC!苹果M4芯片首发;GoEnhance可生成粘土风格视频;DeepSeek-V2模型已在魔搭社区开源

欢迎来到【AI日报】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解&#xff1a;AIbase - 智能匹配最适合您的AI产品和网站 1、干翻AI …

解决uniapp开发微信小程序的,打包上传项目,提示文件过大的问题

前段时间&#xff0c;开发一个uniapp的项目&#xff0c;本来是做成app的&#xff0c;后来客户考虑&#xff0c;还想要微信小程序。我们在微信开发者工具里面上传项目时&#xff0c;一直提示项目太大&#xff0c;超过了2M(20487kb),后来我们尝试了多次&#xff0c;最终找到了解决…

springboot利用切面保存操作日志(支持Spring表达式语言(简称SpEL))

springboot利用切面保存操作日志&#xff08;支持Spring表达式语言&#xff08;简称SpEL&#xff09;&#xff09; 文章目录 springboot利用切面保存操作日志&#xff08;支持Spring表达式语言&#xff08;简称SpEL&#xff09;&#xff09;前言一、Spring EL是什么&#xff1f…

Centos7安装java11

方法一&#xff1a;使用yum安装jdk环环境 查看云端yum库中目前支持安装的jdk软件包 yum search java|grep jdk选择版本安装jdk yum install java-11-openjdk.x86_64安装完成后验证 java -version

今天来聊聊Numpy (二)

​ 上一期和大家简短介绍了一下Numpy​&#xff0c;不知道你还记得惊喜嘛&#x1f440;。不知道的各位看官可以追溯一下上一期内容。&#xff08;别回来打小编就好&#x1f92a;&#x1f92a;&#xff09; ​ 今天来聊聊Numpy&#xff01;&#xff08;&#x1f448;上一期在…

26_Scala集合常用API汇总

文章目录 1.mkString2.size&#xff0c;length&#xff0c;isEmpty,contains3.reverse ,length,distinct4.获取数据相关4.1数据准备4.2准确获取尾部last4.3 除了最后一个元素不要其他都要4.4从集合获取部分数据 5.删除数据5.1删除3个从左边5.2删除3个右边 6.切分数据splitAt(n:…

前后端分离项目合并部署

在web工程下使用npm run build指令&#xff0c;在dist目录下会生成index.html以及static目录 将dist目录下的index.html以及static目录拷贝至后端工程的src/main/resources目录下的static文件夹&#xff08;若没有&#xff0c;则创建&#xff09;。 网上说的配置resource han…

阵痛中的乳业产业,何时才能成为下一个啤酒产业?

说起饮品&#xff0c;近年来中国啤酒业中各大品牌齐齐聚焦高端化的趋势绝对值得一提。然而&#xff0c;与之相反&#xff0c;国内乳业却是仍未进入高端化阶段&#xff0c;甚至陷入了周期底部中。 图源&#xff1a;中国圣牧财报 增收降利 牧企承受巨大的供需缺口压力 从产业链…

Kubernetes最小单元Pod的生命周期

1.1 Pod生命周期 1.1.1 过程及状态 Pod 的生命周期管理是 Kubernetes 集群中非常重要的一部分&#xff0c;它涉及到 Pod 从创建到销毁的整个过程。下面是 Pod 生命周期中各个阶段的简要说明&#xff1a; Pod 创建过程&#xff1a;当一个 Pod 被创建时&#xff0c;Kubernetes 会…

chorme浏览器或者edge浏览器使用开发者模式

本篇文章主要讲解edge&#xff0c;因为它内核是chorme&#xff0c;还可以使用微软账号同步&#xff0c;谷歌翻译也凉凉了&#xff0c;edge还可以用翻译&#xff0c;推荐国内windows用户用它。 打开开发者模式 直接按F12点击右上角三个点...&#xff0c;点击更多工具&#xff…

【第15章】spring-mvc之文件上传和下载

文章目录 前言一、准备1. 打开开关(web.xml)2. 解析器(spring-mvc.xml) 二、上传1. 前端2. 后端3. 结果 三、下载1.前端2.后端3. 结果 总结 前言 请注意&#xff0c;从Spring Framework 6.0及其新的Servlet 5.0基线开始&#xff0c;基于Apache Commons FileUpload的过时的Comm…

如何解决Facebook账号被封的10种方法|2024年最新版

1、facebook广告设置 一般不建议使用自己的个人的账号来设置Facebook广告&#xff0c;我们可以创建新的账号并与个人资料分开来。 如果您需要进行一系列不相关的促销活动&#xff0c;或者促销多个不同的产品或链接&#xff0c;建议您为每个产品或链接创造新的Facebook账号&am…

Remix实现多语言

JS 中不同框架都有自己的多语言库&#xff0c;在 Remix 使用多语言&#xff0c;需要安装 remix-i18next 这个库。这个包是基于 i18next 开发的&#xff0c;使用方式可以到官网查看。 Remix-i18next 安装步骤如下&#xff1a; 安装依赖 npm install remix-i18next i18next rea…

go导入包时提示no required module provides package解决方法

原因&#xff0c;这个包在你的本机没有安装 如redis包的提示为 could not import github.com/gomodule/redigo/redis (no required module provides package "github.com/gomodule/redigo/redis")解决方法&#xff1a; go get github.com/gomodule/redigo/redis

easy_signin_ctfshow_2023愚人杯

https://ctf.show/challenges#easy_signin-3967 2023愚人杯信息检索&#xff0c;在请求荷载中发现一个base64 face.pngencode ZmFjZS5wbmc解密结果 flag.pngencode ZmxhZy5wbmc尝试一下 返回内容 Warning: file_get_contents(flag.png): failed to open stream: No such file…