算法练习题14——leetcode84柱形图中最大的矩形(单调栈)

news2024/9/25 21:30:58

题目描述: 

解题思路:

要解决这个问题,我们需要找到每个柱子可以扩展的最大左右边界,然后计算以每个柱子为高度的最大矩形面积。

具体步骤如下:

  1. 计算每个柱子左侧最近的比当前柱子矮的位置

    • 使用一个单调栈(栈中保存元素索引)从左到右遍历柱子,确保栈中元素始终保持递增(从栈底到栈顶)。
    • 如果当前柱子的高度小于栈顶柱子的高度,则不断弹出栈顶元素,直到找到一个高度小于当前柱子的元素为止。
    • 这样可以确定每个柱子左边第一个比它矮的位置。
  2. 计算每个柱子右侧最近的比当前柱子矮的位置

    • 使用类似的单调栈方法,从右到左遍历柱子,确保栈中元素始终保持递增。
    • 同样地,可以确定每个柱子右边第一个比它矮的位置。
  3. 计算最大矩形面积

    • 计算每个柱子可以扩展的宽度,使用公式 (right[i] - left[i] - 1) * heights[i] 来计算以该柱子为高度的矩形面积。
    • 遍历所有柱子,找到最大面积。

代码示例: 

class Solution {
    public int largestRectangleArea(int[] heights) {
        int n = heights.length;
        int[] left = new int[n]; // 用于存储每个柱子的左边界
        int[] right = new int[n]; // 用于存储每个柱子的右边界
        Stack<Integer> stack = new Stack<>(); // 用于计算左右边界的单调栈

        // 从左到右遍历柱子,计算每个柱子左边第一个比它矮的位置
        for (int i = 0; i < n; i++) {
            // 如果栈不为空且栈顶柱子的高度大于等于当前柱子的高度,弹出栈顶元素
            while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
                stack.pop();
            }
            // 如果栈为空,说明当前柱子左侧没有比它矮的柱子
            if (stack.isEmpty()) {
                left[i] = -1; // 左边界为-1
            } else {
                left[i] = stack.peek(); // 栈顶元素即为左边第一个比当前柱子矮的位置
            }
            // 将当前柱子的索引压入栈中
            stack.push(i);
        }

        stack.clear(); // 清空栈,用于计算右边界

        // 从右到左遍历柱子,计算每个柱子右边第一个比它矮的位置
        for (int i = n - 1; i >= 0; --i) {
            // 如果栈不为空且栈顶柱子的高度大于等于当前柱子的高度,弹出栈顶元素
            while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) {
                stack.pop();
            }
            // 如果栈为空,说明当前柱子右侧没有比它矮的柱子
            if (stack.isEmpty()) {
                right[i] = n; // 右边界为n
            } else {
                right[i] = stack.peek(); // 栈顶元素即为右边第一个比当前柱子矮的位置
            }
            // 将当前柱子的索引压入栈中
            stack.push(i);
        }

        int ans = 0; // 用于存储最大矩形面积
        // 遍历每个柱子,计算以该柱子为高度的最大矩形面积
        for (int i = 0; i < n; i++) {
            // 以heights[i]为高度的矩形面积计算公式为:(right[i] - left[i] - 1) * heights[i]
            ans = Math.max(ans, (right[i] - left[i] - 1) * heights[i]);
        }
        return ans; // 返回最大矩形面积
    }
}

详细解题步骤:

  1. 初始化数组和栈

    • left[i] 存储柱子 i 左侧第一个比其矮的柱子的索引,如果不存在,设置为 -1
    • right[i] 存储柱子 i 右侧第一个比其矮的柱子的索引,如果不存在,设置为 n
    • 使用 Stack 存储柱子的索引,用于计算左右边界。
  2. 计算左边界

    • 遍历所有柱子:
      • 如果当前柱子的高度小于栈顶柱子的高度,弹出栈顶元素,直到找到一个高度小于当前柱子的元素。
      • 如果栈为空,说明当前柱子左侧没有比它矮的柱子,设置 left[i] = -1
      • 否则,设置 left[i] = stack.peek(),即栈顶元素是左边第一个比当前柱子矮的位置。
    • 将当前柱子的索引压入栈中。
  3. 计算右边界

    • 从右到左遍历所有柱子:
      • 使用类似的方法计算每个柱子右边第一个比它矮的位置。
  4. 计算最大矩形面积

    • 遍历所有柱子,以每个柱子作为最矮柱子,计算矩形的最大面积。
    • 使用公式 (right[i] - left[i] - 1) * heights[i] 来计算每个柱子的最大矩形面积。

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

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

相关文章

MATLAB实现PID参数自动整定

目录 1、项目说明 2、文件说明 1、项目说明 本项目旨在通过 MATLAB 语言实现 PID 参数的自动整定&#xff0c;并设计了一个直观易用的 GUI 界面。该系统特别适用于实验室环境下的 PID 参数自整定任务。整定的核心原则在于优化系统性能&#xff0c;使系统的衰减比尽可能接近理…

R-Adapter:零样本模型微调新突破,提升鲁棒性与泛化能力 | ECCV 2024

大规模图像-文本预训练模型实现了零样本分类&#xff0c;并在不同数据分布下提供了一致的准确性。然而&#xff0c;这些模型在下游任务中通常需要微调优化&#xff0c;这会降低对于超出分布范围的数据的泛化能力&#xff0c;并需要大量的计算资源。论文提出新颖的Robust Adapte…

linux————根据端口查找运行目录的三种方法

先查询端口找到进程 netstat -anlpt | grep 16443 | grep -v grep tcp 0 0 0.0.0.0:16443 0.0.0.0:* LISTEN 3710563/nginx: mast tcp 0 0 192.168.110.253:16443 192.168.110.22:64430 ESTABLISHED 3710580/n…

When can I expect multiple “choices“ in an OpenAI response?

题意&#xff1a;"什么时候我可以在 OpenAI 的回复中预期到多个“选择”&#xff1f;" 问题背景&#xff1a; For a simple OpenAI api call in python 对于一个在 python 中简单的 OpenAI API 调用 response openai.ChatCompletion.create(model"gpt-4&quo…

vue2+ueditor集成秀米编辑器

一、百度富文本编辑器 1.首先下载 百度富文本编辑器 下载地址:GitHub - fex-team/ueditor: rich text 富文本编辑器 2.把下载好的文件整理好 放在图片目录下 3. 安装插件vue-ueditor-wrap npm install vue-ueditor-wrap 4.在你所需要展示的页面 引入vue-ueditor-wrap 此时…

苹果电脑需要安装杀毒软件吗?探索Mac的安全世界!

在聊到电脑安全时&#xff0c;许多Mac用户都骄傲地声称&#xff1a;“我的Mac是不会中病毒的&#xff01;”确实&#xff0c;与Windows PC相比&#xff0c;Mac因其UNIX-based的操作系统构架&#xff0c;天生就更加安全。但这是否意味着Mac完全不需要杀毒软件呢&#xff1f;让我…

细胞因子系列

细胞因子是一类分泌性蛋白质&#xff0c;可以调控细胞之间的相互作用以及免疫反应等生物学过程。细胞因子在细胞信号传导、细胞生长、细胞分化和细胞凋亡等过程中起着重要作用。它们可以通过在细胞表面结合受体、介导细胞信号转导&#xff0c;从而调节免疫应答、细胞增殖和炎症…

Oracle RAC环境NBU异机恢复

一、故障原因 9月3日中午&#xff0c;主机运维人员误操作&#xff0c;对sydb数据库的ASM磁盘做了格式化&#xff0c;将三块共享磁盘做了分区&#xff0c;然后使用vgextend命令加入到本地文件系&#xff0c;造成sydb的两个实例异常&#xff0c;没有操作CRS磁盘&#xff0c;所以…

如何在IDEA的一个工程中创建多个项目?

在IDEA中&#xff0c;可以通过Module来创建新的工程。

仕考网:公务员考试资格审核时间是多久?

在国家公务员考试的报名过程中&#xff0c;考生完成信息填报并选定职位之后&#xff0c;资格审核结果将在提交后48小时内在报名信息页面公布。一般是从报名日次日上午8点开始&#xff0c;直至报名截止日次日18点结束。在此期间&#xff0c;考生可以通过国家公务员局的官方网站查…

8.分布式服务部署

文章目录 1.分布式服务部署1.1服务器个数1.2 ubuntu 的 MySQL 安装1.3对其他服务器授权1.4Java服务部署1.5常见问题 大家好&#xff0c;我是晓星航。今天为大家带来的是 分布式服务部署 相关的讲解&#xff01;&#x1f600; 1.分布式服务部署 1.1服务器个数 机器个数 1 - N…

Unity实战之滑动列表居中的放大其他的缩小功能

前言 最近项目需要做一个关卡选择列表,滑动到屏幕中间,代表该关卡被选中,展示选中状态。 预期效果 思路 使用3个父节点(左中右)用于挂载关卡item,通过改变关卡item的父节点来改变item的层级。 创建ui 创建父节点 首先创建一个空节点,命名为levelGroup,代表该节点…

硬刚苹果还得是华为

文&#xff5c;琥珀食酒社 作者 | 璇子 牛皮啊 华为发三折叠不意外 意外的是 这各种翻转简直颠覆想象 市面上没见过这么能“翻转”的&#xff1f; 要不怎么说硬刚苹果 还得看华为 就跟你同天怎么了&#xff1f; 拼创新、拼技术、拼热度 你就说哪比你差吧&#xff1f…

并联电容器后实际输出容量怎么测

要测量并联电容器后的实际输出容量&#xff0c;可以按照以下步骤进行&#xff1a; 1. 准备工作 断电安全&#xff1a;在进行任何测量之前&#xff0c;确保电容器和相关设备已经断电&#xff0c;以确保安全。检查设备&#xff1a;确保所有测量设备和仪器&#xff08;如电容表、…

微信小程序实践案例

参考视频&#xff1a; https://www.bilibili.com/video/BV1834y1676P/?p36&spm_id_frompageDriver&vd_sourceb604c19516c17da30b6b1abb6c4e7ec0 前期准备 1、新建三个页面 "pages": ["pages/home/home","pages/message/message",&quo…

提升竞争力:优化多门店网络的方法

新型门店网络通过先进技术和架构&#xff0c;实现高效、安全的数据传输&#xff0c;优化业务流程&#xff0c;从而提升零售企业的运营效率和客户体验。核心组成包括扁平化网络架构、强大的无线覆盖及安全措施。随着AI和5G的推进&#xff0c;未来门店网络将不断创新&#xff0c;…

完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (三) 代码编译、各种问题解决、代码修改

目录 1 infer_server编译 1.1 infer_server/CMakeLists.txt修改 1.2 FindLibCompute.cmake编写 1.2 findLibCVCuda.cmake编写 1.3 ./3rdparty/config_lib_aarch64.sh修改 1.4 解决各种编译错误 1.4.1 /usr/include/c/11/bits/algorithmfwd.h:259:5: error: ‘pair’ doe…

最值得信赖的10款电脑监控软件推荐

随着信息时代的飞速发展&#xff0c;电脑监控软件在企业管理、家庭安全以及个人隐私保护等多个领域中发挥了重要作用。选择一款功能强大且值得信赖的电脑监控软件&#xff0c;能够帮助用户实现对电脑使用情况的全面监控&#xff0c;保障数据安全并提高工作效率。本文将为您推荐…

FPGA随记——OSERDESE2和IERDESE2

http://t.csdnimg.cn/yNvxf---看这个篇吧 这个挺好的 OSERDESE2 模块要求复位信号高电平有效&#xff0c;并且 需要将异步复位信号同步到串行时钟域。 除了用原语调用&#xff0c;还可以用High Speed SelectIO Wizard这个IP 进行调用 针对具体select IO这个IP的使用和介绍&…

期末C语言基本算法

期末C语言基本算法 题型一 输入两个学生a和b的成绩&#xff0c;输出其中高的成绩 # include <studio.h> void main() {float a,b,max;printf("please enter a and b:");scanf("%f,%f",&a&#xff0c;&b);if(a>b) max a;else max b;pri…