LeetCode困难题----84.柱状图中的最大矩形

今天刷LeetCode时遇到了一个很有意思的题:

        看了半天题解还是没理解他的代码想要表达的是什么意思,在思考了很久之后,终于,我理解了这道题,接下来让我带你们走进这道题。

这道题的大概意思是,给你一个heights[]数组,(宽为1)让你求出他们可以组合出的最大面积

首先,我们先用暴力法解一下这道题:

    /*** 暴力法* 主要思路是拿到每一个高,以该节点为中心,向两边扩散,* 如果遇到小于当前值的柱子,则说明当前高度所能到达的宽度为该柱子** @param heights 传入柱子高度数组* @return 可以勾勒的最大面积*/public static int largestRectangleArea (int[] heights) {int length = heights.length;int res = 0;for (int i = 0; i < length; i++) {int height = heights[i];//拿到当前柱子int left = i, right = i;//从当前数组下标开始,向左右查找while (left - 1 >= 0 && heights[left - 1] >= height) {left--;//当左边界的值比当前值大,left左移}while (right + 1 < length && heights[right + 1] <= height) {right++;//右边界大于当前值时,right右移}/*为什么是(left-1)与(right+1)与当前柱子比??* 因为起始值是left = i,right = i* 所以需要对其进行-1,+1操作** 为什么要从 = i 的时候开始呢?* 因为从i开始可以保证每个值都被遍历到,不会出现某个值漏掉的情况* *///直到找到左右两边的值都比当前柱子低int width = right - left + 1;res = Math.max(res, height * width);}return res;}

but,很遗憾:这样会超时!!!

所以让我们来对代码进行一下优化

        首先我们先来分析一下这个问题,我们需要找到左右两边比当前元素小的元素

那我们应该怎么做呢?

        先来分析一下需求

我们需要找到左边比当前元素小的值      left

还需要找到右边比当前元素小的值         right

最终算出宽度                                         width = right - left + 1

然后拿到当前的值                                  height = heights[i]

最后求出想要的答案                              res = width * height

问题来了,我们如何方便,快捷的拿到左边比当前小的元素呢???

       单调栈应用场景: “在一维数组中找第一个满足某种条件的数”

下面,让我们用单调栈来对这个问题进行优化:

    /*** 以栈代替之前的双指针,* (单调栈,从小到大排列)* * 注意:此时我们计算的面积是栈顶元素对应的最大面积* * 栈顶元素即为当前柱子的高度,* 找到右边首个小于当前高度的值(左边是栈顶元素的下一个)* 便可计算出宽度* @param heights* @return*/public static int largestRectangleArea (int[] heights) {Stack<Integer> stack = new Stack<>();int res = 0;int[] arr = new int[heights.length + 1];for (int i = 0; i < heights.length; i++) {arr[i] = heights[i];}arr[heights.length] = -1;for (int i = 0; i < arr.length; i++) {/* 为什么用while()???* 因为当前元素弹出后,下一个元素为左边第二高的柱子,* 需要继续对其(第二高)进行最大面积的计算* */while (!stack.isEmpty() && arr[i] < arr[stack.peek()]) {//如果当前元素小于栈顶元素int height = arr[stack.pop()];//拿出栈顶元素对应的height,此时栈顶元素为目前的柱子int left = stack.isEmpty() ? -1 : stack.peek();//stack.pop()之后,记得判断当前栈是否为空int width = (i - left - 1);//求出对应的width(stack.peek()与i为height的左右两个小于元素)res = Math.max(res, width * height);//计算结果:当前的最大矩形}stack.push(i);//前面栈顶元素都弹出后,当前元素放入栈中}return res;}

        其中有难度的点我已经写在注释里了,如果还有什么不会的地方,可以评论或者私信问我,我看到之后会第一时间回复的!!!作为一个算法小白,我的理解都在这里了,可能还有的地方写的不是很明白,感谢观看。

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

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

相关文章

一些刷题需要用的大数据

无符号版本和有符号版本的区别就是有符号类型需要使用一个bit来表示数字的正负。 如果需声明无符号类型的话就需要在类型前加上unsigned。 整型的每一种都分为&#xff1a;无符号&#xff08;unsigned&#xff09;和有符号&#xff08;signed&#xff09;两种类型&#xff08;f…

进阶二叉树

目录 二叉树 二叉搜索树 二叉搜索树的定义 二叉搜索树的操作 哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 哈夫曼树的性质 平衡二叉树 平衡二叉树的定义&#xff1a; 平衡二叉树的插入调整 1.LL插入/LL旋转 2.RR插入/RR旋转 3.LR插入/LR旋转 4.RL插入/RL旋转 二叉树…

mac【启动elasticsearch报错:can not run elasticsearch as root

mac【启动elasticsearch报错&#xff1a;can not run elasticsearch as root 问题原因 es默认不能用root用户启动&#xff0c;生产环境建议为elasticsearch创建用户。 解决方案 为elaticsearch创建用户并赋予相应权限。 尝试了以下命令创建用户&#xff0c;adduser esh 和u…

分布式之Skywalking

Skywalking skywalking是一个apm系统&#xff0c;包含监控&#xff0c;追踪&#xff0c;并拥有故障诊断能力的 分布式系统 一、Skywalking介绍 1.什么是SkyWalking Skywalking是由国内开源爱好者吴晟开源并提交到Apache孵化器的产品&#xff0c;它同时吸收了Zipkin /Pinpoint …

【JS】替换文本为emjio表情

最终效果展示 T1 T2 T3 T4 需求 把评论你好帅啊啊啊[开心][开心]&#xff0c;[开心] 替换为图片 思路 正则match提取[开心]到一个数组数组去重创建img标签img标签转文本. 。例&#xff1a;&#xff08;el.outerHTML&#xff09;&#xff0c;将el元素转文本字符串replaceAll…

流畅的 Python 第二版(GPT 重译)(十三)

第二十四章&#xff1a;类元编程 每个人都知道调试比一开始编写程序要困难两倍。所以如果你在编写时尽可能聪明&#xff0c;那么你将如何调试呢&#xff1f; Brian W. Kernighan 和 P. J. Plauger&#xff0c;《编程风格的要素》 类元编程是在运行时创建或自定义类的艺术。在 P…

新版 mac 浏览器乱码

现象 如下图&#xff0c;chrome 浏览器有的乱码了 解决方法 删除字体集中的微软雅黑&#xff08;下图已删除&#xff09;&#xff0c;右键移除

算法打卡day18|二叉树篇07|Leetcode 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

算法题 Leetcode 530.二叉搜索树的最小绝对差 题目链接:530.二叉搜索树的最小绝对差 大佬视频讲解&#xff1a;二叉搜索树的最小绝对差视频讲解 个人思路 因为是在二叉搜索树求绝对差&#xff0c;而二叉搜索树是有序的&#xff0c;那就把它想成在一个有序数组上求最值&…

HTML + CSS 核心知识点- 定位

简述&#xff1a; 补充固定定位也会脱离文档流、不会占据原先位置 1、什么是文档流 文档流是指HTML文档中元素排列的规律和顺序。在网页中&#xff0c;元素按照其在HTML文档中出现的顺序依次排列&#xff0c;这种排列方式被称为文档流。文档流决定了元素在页面上的位置和互相之…

探索数据结构:双向链表的灵活优势

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 前言 前面我们学习了单链表&#xff0c;它解决了顺序表中插入删除需…

深度学习——数据预处理

一、数据预处理 为了能用深度学习来解决现实世界的问题&#xff0c;我们经常从预处理原始数据开始&#xff0c; 而不是从那些准备好的张量格式数据开始。 在Python中常用的数据分析工具中&#xff0c;我们通常使用pandas软件包。 像庞大的Python生态系统中的许多其他扩展包一样…

知识蒸馏——深度学习的简化之道 !!

文章目录 前言 1、什么是知识蒸馏 2、知识蒸馏的原理 3、知识蒸馏的架构 4、应用 结论 前言 在深度学习的世界里&#xff0c;大型神经网络因其出色的性能和准确性而备受青睐。然而&#xff0c;这些网络通常包含数百万甚至数十亿个参数&#xff0c;使得它们在资源受限的环境下&…

中霖教育:注册会计师考试难度大吗?

注册会计师被很多人认为是非常具有挑战性的考试&#xff0c;内容涵盖《会计》《审计》《税法》《经济法》《财务成本管理》《公司战略与风险管理》&#xff0c;考的知识点多而复杂&#xff0c;需要牢牢掌握&#xff0c;所以很多人认为这项考试的难度非常大。 注册会计师考试分…

uniapp使用Echarts图表H5显示正常 打包app显示异常

uniapp使用Echarts在H5页面调试 调试完在H5正常显示 然后通过安卓机调试的时候 发现直接空白了 还有这个爆错 Initialize failed: invalid dom 我有多个图表、图表是通过v-for循环出来的 解决方案 原来是yarn直接安装Echarts 然后改成本地JS文件引入 gitbub文件地址 — dist/…

[python]bar_chart_race绘制动态条形图

最近在 B 站上看到了一个宝藏 up 主&#xff0c;名叫 "Jannchie见齐"&#xff0c;专门做动态条形图相关的数据可视化。 可以看到做出的效果还是很不错的&#xff0c;但工具使用的是 JS&#xff0c;不是 Python&#xff0c;于是尝试搜索了一下&#xff0c;看看 Python…

[C语言]——函数递归

目录 一.什么是递归 1.递归的思想&#xff1a; 二.递归的限制条件 三.递归举例 1.举例1&#xff1a;求n的阶乘 1.1分析和代码实现 1.2画图推演 2.举例2&#xff1a;顺序打印⼀个整数的每⼀位 2.1分析和代码实现 2.2画图推演 四.递归与迭代 1.举例3&#xff1a;求第…

Git全套教程一套精通git.跟学黑马笔记

Git全套教程一套精通git.跟学黑马笔记 文章目录 Git全套教程一套精通git.跟学黑马笔记1.版本管理工具概念2. 版本管理工具介绍2.1版本管理发展简史(维基百科)2.1.1 SVN(SubVersion)2.1.2 Git 3. Git 发展简史4. Git 的安装4.1 git 的下载4.2 安装4.3 基本配置4.4 为常用指令配置…

【机器学习】深入解析线性回归模型

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

STM32CubeMX+freeRTOS+事件组 多任务处理LED和串口打印

摘要:利用CubeMx配置freeeRTOS建立任务并使用事件组实现按键按下时 LED开关和打印信息到串口,上位机接收显示。 验证STM32CubeMx配置的FreeRTOS的任务和事件组使用 方案:按下Key1,绿灯亮或者灭,同时串口打印Key1被按下了到上位机;相关端口和串口配置省略。 新建三个任务…

VMware部署银河麒麟遇到的问题记录

1. 解决VMware Workstation安装VMware Tools显示灰色的办法 1.关闭虚拟机; 2.在虚拟机设置分别设置CD/DVD、CD/DVD2和软盘为自动检测三个步骤; 3.再重启虚拟机,灰色字即点亮。 2.Linux安装vmTool