研习代码 day52 | 单调栈问题——柱状图中最大的矩形

news2024/11/20 13:17:19

一、柱状图中最大的矩形

        1.1 题目

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= heights.length <=10^5
  • 0 <= heights[i] <= 10^4

        1.2 题目链接

        84.柱状图中最大的矩形

        1.3 解题思路和过程想法

        (1)解题思路

        思路:
        以当前列为高度的矩形,需找到左右第一个比其矮的两个列,以两个列之间的距离(不包括这两列)为宽度,高度*宽度=以当前列为高度的矩形大小。要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置--->单调栈
        细节:
        # 若数组出现单调增,则会一直入栈,不会有结果,此时需在结尾加一个 0
        # 若数组出现单调减,则会一直出栈,为有统计结果,此时需在起始处加一个 0
                 upStack = [0]   # 赋有初始值,保证只有两个数时也可计算
        # 当前数大于栈顶数---》压栈
        # 当前数等于栈顶数-------》先弹栈,后压栈(若连续出现相等,为不重复,只计算一次)
        # 当前数小于栈顶数:当前(小) 栈顶(中) 栈顶内侧(小),按照思路统计矩形面积

        (2)过程想法

        构思矩形的计算方式才是关键
        我对于栈的单调性有自己的理解,我不记固定的单调关系:
               若要找左侧或右侧第一个比栈顶元素都的元素,就将比它的都压栈,直到遇到比栈顶元素的元素
              若要找左侧或右侧第一个比栈顶元素都的元素,就将比它的都压栈,直到遇到比栈顶元素的元素

        1.4 代码

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        # 接雨水是不用统计第一个和最后一个节点,但此处需要思考
        # 若数组出现单调增,则会一直入栈,不会有结果,此时需在结尾加一个 0
        # 若数组出现单调减,则会一直出栈,为有统计结果,此时需在起始处加一个 0
        if len(heights) == 1:
            return heights[0]


        heights.insert(0,0)
        heights.append(0)
        length = len(heights)
        upStack = [0]   # 赋有初始值,保证只有两个数时也可计算
        res = 0

        for i in range(1,length):
            if len(upStack) == 0 or heights[i] >= heights[upStack[-1]]: # 当前数大于栈顶数
                upStack.append(i)
            elif len(upStack) == 0 or heights[i] >= heights[upStack[-1]]: # 当前数等于栈顶数-------》若连续出现相等,为不重复,只计算一次
                upStack.pop()
                upStack.append(i)
            else:
                while len(upStack) and heights[i] < heights[upStack[-1]]:  # 当前数小于栈顶数:当前(小) 栈顶(中) 栈顶内侧(小)
                    mid = heights[upStack[-1]]
                    upStack.pop()
                    if len(upStack) > 0:
                        left = upStack[-1]
                        right = i
                        h = mid
                        w = right - left - 1
                        res = max(res, h*w)
                upStack.append(i)

        return res

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

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

相关文章

TruLens RAG Triad 学习

TruLens RAG Triad 学习 0. 背景1. RAG 三元组2. TruLens 快速入门2-1. 安装依赖2-2. 初始化 OpenAI 认证信息2-3. 获取数据2-4. 创建向量存储2-5. 从头构建自定义 RAG2-6. 设置反馈函数2-7. 构建应用程序2-8. 运行应用程序0. 背景 近年来,RAG 架构已成为为大型语言模型 (LLM…

第21章总结 网络通信

21.1网络程序设计基础 21.1.1 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 21.1.2 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#x…

如何利用人工智能+物联网技术实现自动化设备生产

随着科技的发展与行业竞争的日益激烈&#xff0c;制造业也逐渐走向智能化发展。制造业的改革是利用物联网技术和自动化设备&#xff0c;实现生产线的智能化和自适应生产&#xff0c;优化生产流程&#xff0c;提高生产效率和质量&#xff0c;为企业创造更大的价值。 方案概述 智…

计算目标检测和语义分割的PR

需求描述 实际工作中&#xff0c;相比于mAP项目更加关心的是特定阈值下的precision和recall结果&#xff1b;由于本次的GT中除了目标框之外还存在多边形标注&#xff0c;为此&#xff0c;计算IoU的方式从框与框之间变成了mask之间&#xff1b; 本文的代码适用于MMDetection下的…

wireshark过滤包小技巧

1、过滤包含某个字符串的数据包&#xff1a; 或者&#xff1a; 2、过滤包含某一连续十六进制的数据包&#xff1a; 或者&#xff1a; 3、过滤精确到位数位置 或者&#xff1a;

1-Tornado的介绍

1 tornado的介绍 **Tornado**是一个用Python编写的可扩展的、无阻塞的**Web应用程序框架**和**Web服务器**。 它是由FriendFeed开发使用的&#xff1b;该公司于2009年被Facebook收购&#xff0c;而Tornado很快就开源了龙卷风以其高性能着称。它的设计允许处理大量并发连接&…

实时动作识别学习笔记

目录 yowo v2 yowof 判断是在干什么,不能获取细节信息 yowo v2 https://github.com/yjh0410/YOWOv2/blob/master/README_CN.md ModelClipmAPFPSweightYOWOv2-Nano1612.640ckptYOWOv2-Tiny

2024年度AI投资策略报告:乘AI之风,破明日之浪

今天分享的AI系列深度研究报告&#xff1a;《2024年度AI投资策略报告&#xff1a;乘AI之风&#xff0c;破明日之浪》。 &#xff08;报告出品方&#xff1a;万联证券&#xff09; 报告共计&#xff1a;25页 1 需求复苏&#xff0c;政策指引热点驱动AI 赋能助推行业发展 1.1 …

【车载开发系列】Visio工具使用小技巧

【车载开发系列】Visio工具使用小技巧 【车载开发系列】Visio工具使用小技巧 【车载开发系列】Visio工具使用小技巧一. Word中编辑Visio技巧二. Word中插入visio图形的问题三. 总结 一. Word中编辑Visio技巧 本节主要介绍了Microsoft Word中编辑Visio图形的具体方法。 在 Word…

PyQt6 QTimeEdit时间控件

​锋哥原创的PyQt6视频教程&#xff1a; 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计39条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话…

Echarts图表title使用富文本

rich中有配置的话&#xff08;如a&#xff09;使用该样式&#xff0c;没有配置样式的话&#xff08;如b&#xff09;使用外层textstyle的样式&#xff0c;textstyle没有样式的话使用默认样式 const option1 {tooltip: {trigger: "item",},title: {text: ["{a|1…

线程及实现方式

一、线程 线程是一个基本的CPU执行单元&#xff0c;也是程序执行流的最小单位。引入线程之后&#xff0c;不仅是进程之间可以并发&#xff0c;进程内的各线程之间也可以并发&#xff0c;从而进一步提升了系统的并发度&#xff0c;使得一个进程内也可以并发处理各种任务&#x…

Linux就该这么学(第一天)

1.1 准备您的工具 所谓“工欲善其事&#xff0c;必先利其器”&#xff0c;在本章学习过程中&#xff0c;读者需要搭建出为今后练习而使用的红帽RHEL 7系统环境。您不需要为了练习实验而特意再购买一台新电脑&#xff0c;下文会讲解如何通过虚拟机软件来模拟出仿真系统。虚拟机…

使用 Tailwind CSS 完成导航栏效果

使用 Tailwind CSS 完成导航栏效果 本文将向您介绍如何使用 Tailwind CSS 创建一个漂亮的导航栏。通过逐步演示和示例代码&#xff0c;您将学习如何使用 Tailwind CSS 的类来设计和定制导航栏的样式。 准备工作 在开始之前&#xff0c;请确保已经安装了 Tailwind CSS。如果没…

异步回调模式

异步回调 所谓异步回调&#xff0c;本质上就是多线程中线程的通信&#xff0c;如今很多业务系统中&#xff0c;某个业务或者功能调用多个外部接口&#xff0c;通常这种调用就是异步的调用。如何得到这些异步调用的结果自然也就很重要了。 Callable、Future、FutureTask publi…

Python中利用遗传算法探索迷宫出路

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 当处理迷宫问题时&#xff0c;遗传算法提供了一种创新的解决方案。本文将深入探讨如何运用Python和遗传算法来解决迷宫问题。迷宫问题是一个经典的寻路问题&#xff0c;寻找从起点到终点的最佳路径。遗传算法是一…

半导体划片机助力氧化铝陶瓷片切割:科技与工艺的完美结合

在当今半导体制造领域&#xff0c;氧化铝陶瓷片作为一种高性能、高可靠性的材料&#xff0c;被广泛应用于各种电子设备中。而半导体划片机的出现&#xff0c;则为氧化铝陶瓷片的切割提供了新的解决方案&#xff0c;实现了科技与工艺的完美结合。 氧化铝陶瓷片是一种以氧化铝为基…

基于ssm端游账号销售管理系统论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对端游账号销售信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…

单片机语言--C51语言的数据类型以及存储类型以及一些基本运算

C51语言 本文主要涉及C51语言的一些基本知识&#xff0c;比如C51语言的数据类型以及存储类型以及一些基本运算。 文章目录 C51语言一、 C51与标准C的比较二、 C51语言中的数据类型与存储类型2.1、C51的扩展数据类型2.2、数据存储类型 三、 C51的基本运算3.1 算术运算符3.2 逻辑…

使用Draw.io制作泳道图

使用Draw.io制作泳道图 一、横向泳道图1. 有标题泳道图2. 无标题泳道图3. 横纵向扩展泳道 二、纵向泳道图三、横纵交错地泳道图想做这样的图具体步骤1. 拖拽一个带标题的横向泳道图2. 拖拽一个带标题的单一图&#xff0c;并且把它放进Lane1中3. 其他注意 四、下载文件说明 一、…