73、栈-柱状图中最大的矩形

思路:

 矩形面积:宽度*高度

高度如何确定呢?就是在宽度中最矮的元素。如何确定宽度,就是要确定左右边界。

当我们在处理直方图最大矩形面积问题时,遇到一个比栈顶柱子矮的新柱子时开始计算面积的原因关键在于如何确定一个矩形的左右边界:

  1. 左边界的确定

    • 在单调递增栈中,每一个柱子的左边界是由前一个比它矮的柱子决定的。当一个柱子入栈时,栈中前一个柱子的高度必定小于或等于当前柱子的高度。因此,当某个柱子被从栈中弹出时,意味着找到了一个比它高的左边界,这个左边界正是栈中该柱子前面的柱子的位置。
  2. 右边界的确定

    • 当我们遇到一个比栈顶柱子矮的新柱子时,这个新柱子的索引就成了栈顶柱子的右边界,因为这标志着右侧出现了一个无法继续扩展当前栈顶柱子宽度的点。此时,栈顶柱子及其之前的所有比它高的柱子都需要被处理,因为我们已经找到了它们的右边界。
  3. 面积计算

    • 弹出栈顶元素(某个高柱子),此时可以确定该柱子的高度,而宽度是从它的左边界(前一个栈元素,如果栈为空则为-1)到右边界(当前低柱子的前一个位置)之间的距离。计算出的面积就是以该高柱子为高的最大矩形面积。

代码如下:

class Solution {public int largestRectangleArea(int[] heights) {int n = heights.length;  // 直方图的柱子个数Stack<Integer> stack = new Stack<>();  // 使用栈来存储柱子的索引int res = 0;  // 最大面积初始化为0// 遍历每个柱子for (int i = 0; i < n; i++) {// 当栈不为空,并且当前柱子的高度小于栈顶柱子的高度时while (!stack.isEmpty() && heights[i] < heights[stack.peek()]) {int height = heights[stack.pop()];  // 获取栈顶柱子的高度int width = 0;  // 初始化宽度// 如果栈为空,说明当前弹出的柱子左边没有比它矮的柱子if (stack.isEmpty()) {width = i;  // 宽度为当前索引} else {// 否则,宽度为当前索引减去新的栈顶索引减一width = i - stack.peek() - 1;}// 计算可能的最大面积,并更新结果res = Math.max(res, width * height);}// 将当前柱子的索引入栈stack.push(i);}// 清理栈中剩余的柱子while (!stack.isEmpty()) {int height = heights[stack.pop()];  // 获取栈顶柱子的高度int width = 0;  // 初始化宽度// 如果栈为空,说明右边没有柱子if (stack.isEmpty()) {width = n;  // 宽度为柱子总数} else {// 否则,宽度为柱子总数减去新的栈顶索引减一width = n - stack.peek() - 1;}// 计算可能的最大面积,并更新结果res = Math.max(res, width * height); }return res;  // 返回最大面积}
}

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

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

相关文章

opencv基础篇 ——(十)非真实感渲染

非真实感渲染&#xff08;Non-Photorealistic Rendering, NPR&#xff09;是指通过一系列图像处理技术&#xff0c;将真实感图像转换为具有特定艺术风格或视觉效果的图像&#xff0c;模拟绘画、素描、卡通等非现实主义表现手法。OpenCV 提供了一些内置函数来实现非真实感渲染&a…

74、堆-数组中的第K个最大元素

思路&#xff1a; 直接排序是可以的&#xff0c;但是时间复杂度不符合。可以使用优先队列&#xff0c;代码如下&#xff1a; class Solution {public int findKthLargest(int[] nums, int k) {if (numsnull||nums.length0||k<0||k>nums.length){return Integer.MAX_VAL…

全域团购外卖SAAS系统是什么?

随着多家互联网平台的团购外卖板块逐渐稳定&#xff0c;不少人不再满足于只做1~2个平台的团购外卖服务商&#xff0c;想要拓宽业务范围。在此背景下&#xff0c;全域团购外卖SAAS应运而生&#xff0c;进一步推动了全域团购外卖的流行。 而所谓全域团购外卖&#xff0c;就是指所…

Android Perfetto 监控应用启动耗时

Perfetto 是一个 Google 开发的用于安卓系统性能监控和调试的工具&#xff0c;它旨在提供实时数据收集和可视化功能&#xff0c;帮助我们分析和优化应用程序的性能表现。Perfetto 可以捕获系统事件、CPU、内存、网络、GPU 等性能指标数据&#xff0c;并将其记录为轻量级的 Trac…

链表刷题集

文章目录 概要反转链表代码Python代码C 环形链表代码Python代码Java 小结 概要 这个主要记录下刷的一些题。 链表已经看过了&#xff0c;之前写了篇链表的文章&#xff0c;这一篇&#xff0c;写点跟链表有关的题。主要是leetcode上的。目的是熟悉下代码&#xff0c;代码这东西…

2024 JAVA Tinypng压缩图片,超级简单!!!

一、打开官网&#xff0c;注册账号&#xff0c;获取秘钥&#xff08;每个月500张免费&#xff09; 1.打开官网&#xff0c;注册账号 TinyPNG – Compress WebP, PNG and JPEG images intelligently 2.登录后&#xff0c;点击账号名字&#xff0c;找到如图所示 3.找到API&…

当众演讲技巧的方法有哪些(3篇)

当众演讲技巧的方法有哪些&#xff08;3篇&#xff09; 当众演讲技巧的方法有很多&#xff0c;下面我将分三篇来详细阐述其中的一些关键技巧&#xff1a; **篇&#xff1a;准备与开场技巧 充分准备&#xff1a;提前规划演讲内容&#xff0c;明确主题和目标&#xff0c;准备详…

螺旋角和导程、转位后的齿轮有什么关系?

最近和小伙伴聊到了一个问题&#xff1a;斜齿轮螺旋角和导程的关系&#xff0c;主要是在遇到在采用转位设计方式的刀具时&#xff0c;更觉得有点迷惑&#xff0c;今天咱们就聊聊这个事儿。 先来说斜齿轮螺旋角和导程的关系&#xff1a; 斜齿轮是有多个螺旋面组成的&#xff0…

解决RTC内核驱动的问题bm8563

常用pcf-8563 , 国产平替BM8563(驱动管脚一致)&#xff1b; 实时时钟是很常用的一个外设&#xff0c;通过实时时钟我们就可以知道年、月、日和时间等信息。 因此在需要记录时间的场合就需要实时时钟&#xff0c;可以使用专用的实时时钟芯片来完成此功能 RTC 设备驱动是一个标准…

【证明】快慢指针在带环链表中是否存在无法相遇的情形

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1. 前言2. 证明过程2.1 证明2.2 加证 3. 结论4. 结语 1. 前言 在了解本次内容前&#xff…

牛客热题:判断链表是否有环

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;判断链表是否有环题目链接方法一…

ansible-playbook离线升级centos内核

目录 概述实践ansible目录结构关键代码执行效果 结束 概述 内核离线包官网下载地址如下&#xff1a; 地址 实践 ansible目录结构 如对 ansible 不熟悉&#xff0c;离线包下载有问题&#xff0c;请至此地址下载&#xff0c;按本文操作可直接使用。 相关文章链接如下 文章地…