LeetCode 84:柱状图中的最大矩形

news2024/10/6 4:04:25

一、题目描述

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

输入: heights = [2,4]
输出: 4

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104

二、思路分析

使用栈空间来解决本题,通过空间换时间的方式。

三、代码参考

1、Java

class Solution {
    public int largestRectangleArea(int[] heights) {
        // 获取数组长度
        int len = heights.length;
        // 数组长度为 0 或者 1 时直接返回
        if(len == 0){
            return 0;
        }
        if(len == 1){
            return heights[0];
        }
        // 用来返回最大面积,初始值为 0
        int area = 0;
        // 创建栈空间做辅助
        Deque<Integer> stack = new ArrayDeque<>();
        // 循环遍历数组
        for(int i = 0; i < len; i++){
            // 
            while(!stack.isEmpty() && heights[stack.peekLast()] > heights[i]){
                // 获取栈顶高度,并移除当前栈顶
                int height = heights[stack.removeLast()];
                // 做特殊的处理,如果当前栈顶的高度和上一个栈顶的高度相同,则也需要进行弹栈
                while(!stack.isEmpty() && heights[stack.peekLast()] == height){
                    // 移除栈顶元素
                    stack.removeLast();
                }
                // 创建宽度变量,初始值为 0
                int width = 0;
                // 如果栈为空,说明,有效柱体能够从 i 的左边一直延伸到第一个开始
                if(stack.isEmpty()){
                    // 所以此时的宽度为 i
                    width = i;
                }else {
                    width = i - stack.peekLast() - 1;
                }
                // 计算面积, 长 * 宽,并获取最大面积
                area = Math.max(area, height * width);
            }
            // 将下标存入栈空间中
            stack.addLast(i);
        }
        // 将当前栈中的所有元素弹出
         while(!stack.isEmpty()){
                // 获取栈顶高度,并移除当前栈顶
                int height = heights[stack.removeLast()];
                // 做特殊的处理,如果当前栈顶的高度和上一个栈顶的高度相同,则也需要进行弹栈
                while(!stack.isEmpty() && heights[stack.peekLast()] == height){
                    // 移除栈顶元素
                    stack.removeLast();
                }
                // 创建宽度变量,初始值为 0
                int width = 0;
                // 如果栈为空,说明,有效柱体能够从 i 的左边一直延伸到第一个开始
                if(stack.isEmpty()){
                    // 所以此时的宽度为 len
                    width = len;
                }else {
                    width = len - stack.peekLast() - 1;
                }
                // 计算面积, 长 * 宽,并获取最大面积
                area = Math.max(area, height * width);
            }
        // 返回面积结果
        return area;
    }
}

2、Python

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        size = len(heights)
        area = 0

        stack = []

        for i in range(size):
            while len(stack) > 0 and heights[i] < heights[stack[-1]]:
                height = heights[stack.pop()]

                while len(stack) > 0 and height == heights[stack[-1]]:
                    stack.pop()

                if len(stack) > 0:
                    width = i - stack[-1] - 1
                else:
                    width = i

                area = max(area, height * width)
            stack.append(i)

        while len(stack) > 0 is not None:
            height = heights[stack.pop()]
            while len(stack) > 0 and height == heights[stack[-1]]:
                stack.pop()

            if len(stack) > 0:
                width = size - stack[-1] - 1
            else:
                width = size
            area = max(area, height * width)

        return area

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

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

相关文章

智慧工地SaaS云平台源码:监管端、工地端、危大工程、智慧大屏、物联网、塔机、吊钩、升降机

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合&#xff0c;为工程项目管理提供先进技术手段&#xff0c;构建工地现场智能监控和控制体系&#xff0c;弥补传统方法在监管中的缺陷&#xff0c;最终实现项目对人、机、料、法、环的全…

vue组件内外数据保持同步 组件数据加载解析顺序

背景与简介 一个公共的组件&#xff0c;比如BaseTable&#xff0c;需要同步组件内外部数据的同步&#xff0c;组件内部数据修改&#xff0c;组件外数据同步修改&#xff0c;组件外部数据修改&#xff0c;组件内部数据同步修改&#xff1b;同时&#xff0c;当组件内外部数据修改…

Java建筑工程建设智慧工地源码

智慧工地管理平台依托物联网、互联网&#xff0c;建立云端大数据管理平台&#xff0c;形成“端云大数据”的业务体系和新的管理模式&#xff0c;从施工现场源头抓起&#xff0c;最大程度的收集人员、安全、环境、材料等关键业务数据&#xff0c;打通从一线操作与远程监管的数据…

【Pytorch】学习记录分享13——OCR(Optical Character Recognition,光学字符识别)

[TOC](OCR(Optical Character Recognition,光学字符识别)) 1. OCR资源汇总 OCR(Optical Character Recognition,光学字符识别)指提取图像中的文字信息&#xff0c;通常包括文本检测和文本识别。 文字检测&#xff1a;将图片中的文字区域位置检测出来&#xff08;如图1(b)所示…

FaceChain-FACT:免训练的丝滑体验,秒级别的人像生成

FaceChain-FACT&#xff1a;免训练的丝滑体验&#xff0c;秒级别的人像生成 项目主页&#xff1a;FaceChain-fact&#xff1a;Face Adapter for Human AIGC github项目&#xff1a;https://github.com/modelscope/facechain 1.介绍 作为AI人像写真开源项目的佼佼者&#xff…

华硕飞行堡垒FX53VD键盘全部失灵【除电源键】

华硕飞行堡垒FX53VD键盘全部失灵【除电源键】 前言一、故障排查二、发现问题三、使用方法总结 前言 版本型号&#xff1a; 型号 ASUS FX53VD&#xff08;华硕-飞行堡垒&#xff09; 板号&#xff1a;GL553VD 故障情况描述&#xff1a; 键盘无法使用&#xff0c;键盘除开机键外…

Qt During startup program exited with code 0xc0000135

网上试了好多办法没有用&#xff0c;可以试试在pro目录下加入如图所示的.dll 可以下个everything搜索整个电脑查看是否有上述dll&#xff0c;如果没有也可以网上下载或者点击连接

【博士每天一篇论文-算法】Optimal modularity and memory capacity of neural reservoirs

阅读时间&#xff1a;2023-11-15 1 介绍 年份&#xff1a;2019 作者&#xff1a;Nathaniel Rodriguez 印第安纳大学信息学、计算和工程学院&#xff0c;美国印第安纳州布卢明顿 期刊&#xff1a; Network Neuroscience 引用量&#xff1a;39 这篇论文主要研究了神经网络的模块…

认识SpringBoot中的条件注解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…

Java多线程并发篇----第四篇

系列文章目录 文章目录 系列文章目录前言一、volatile 是什么?可以保证有序性吗?二、Thread 类中的start() 和 run() 方法有什么区别?三、为什么wait, notify 和 notifyAll这些方法不在thread类里面?四、为什么wait和notify方法要在同步块中调用?前言 前些天发现了一个巨…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-2(4) 质量刚体的在坐标系下运动

本文仅供学习使用&#xff0c;总结很多本现有讲述运动学或动力学书籍后的总结&#xff0c;从矢量的角度进行分析&#xff0c;方法比较传统&#xff0c;但更易理解&#xff0c;并且现有的看似抽象方法&#xff0c;两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

MySQL 从零开始:04 增删改查

文章目录 1、准备工作2、insert 增加数据2.1 添加所有列的数据2.2 添加部分列2.3 一次插入多条数据 3、delete 删除记录4、update 更新记录5、select 查询记录5.1 查询所有行所有列5.2 查询指定行的所有列5.3 查询所有行的指定列5.4 查询指定行的指定列 在上一小节中介绍了 MyS…

狄克逊(Dixon)检验

目录 1.介绍&#xff1a;2.效果&#xff1a;小结&#xff1a; 1.介绍&#xff1a; 狄克逊检验法是一种用于检测异常值的统计方法&#xff0c;它是一种非参数的方法&#xff0c;可以有效地寻找数据集中不正常的观测值。该方法由美国统计学家布鲁斯E狄克逊&#xff08;Bruce E. …

代理IP连接不上?网速过慢?自检与应对方法来了

当您使用代理时&#xff0c;您可能会遇到不同的代理错误代码显示代理IP连不通、访问失败、网速过慢等种种问题。 在本文中中&#xff0c;我们将讨论您在使用代理IP时可能遇到的常见错误、发生这些错误的原因以及解决方法。 一、常见代理服务器错误 当您尝试访问网站时&#…

【题解】—— LeetCode一周小结1

1.经营摩天轮的最大利润 题目链接&#xff1a; 1599. 经营摩天轮的最大利润 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱&#xff0c;但每次轮转都需要支付一定的运行成本 runningCost 。摩…

任务管理器的 top

文章目录 任务管理器的 top常规使用显示完整命令设置信息更新次数设置信息更新时间显示指定的进程信息指定用户的进程信息更多信息 任务管理器的 top top命令比较像Windows里面的任务管理器&#xff0c;提供一个动态实时的系统状态检测&#xff0c;可以检测实时显示内存、CPU、…

openGauss学习笔记-193 openGauss 数据库运维-常见故障定位案例-备机卡住-数据库只读

文章目录 openGauss学习笔记-193 openGauss 数据库运维-常见故障定位案例-备机卡住-数据库只读193.1 switchover操作时&#xff0c;主机降备卡住193.1.1 问题现象193.1.2 原因分析193.1.3 处理办法 193.2 磁盘空间达到阈值&#xff0c;数据库只读193.2.1 问题现象193.2.2 原因分…

不定期更新免费签|在线安装全能签轻松签万能签GBOX魔力签喵喵签|赶快白嫖

使用Safari浏览器打开 1.打开平台ios.hccld.com点击应用后的“获取”获取设备UDID&#xff0c;获取后在我的里上就会显示设备UDID信息。 2.点我的-购买证书&#xff0c;选择需要购买的证书进行购买。 3.点击“兑换证书”&#xff0c;输入购买的兑换码。 4.选择你要安装的签名安…

大模型PEFT技术原理(一):BitFit、Prefix Tuning、Prompt Tuning

随着预训练模型的参数越来越大&#xff0c;尤其是175B参数大小的GPT3发布以来&#xff0c;让很多中小公司和个人研究员对于大模型的全量微调望而却步&#xff0c;近年来研究者们提出了各种各样的参数高效迁移学习方法&#xff08;Parameter-efficient Transfer Learning&#x…

论文封面表格制作

原文参考&#xff1a;【【论文排版】论文封面完美对齐 强迫症重度患者的经验分享】https://www.bilibili.com/video/BV18f4y1p7hc?vd_source046491acdcff4b39fed20406b36a93e2 视频里up主介绍很详细。我自己也记录一下。 介绍一下如何完成论文封面信息的填写。 创建一个3列…