[python 刷题] 84 Largest Rectangle in Histogram

[python 刷题] 84 Largest Rectangle in Histogram

题目:

Given an array of integers heights representing the histogram’s bar height where the width of each bar is 1, return the area of the largest rectangle in the histogram.

这题也是一个典型的 monotonic stack 的题,解题思路是将 (x, y) 的配对保存到 stack 中,其中 x 为当前 histogram 可能达到的最左侧点,即最大长度,而 y 则是保存当前 histogram 最大高度。其逻辑是,对于 histogram 来说,随着 x 轴增长时,会遇到以下三种情况:

  • y 出现增加

    在这里插入图片描述

    当前情况下,蓝色方块 y 不受限制,x 是可以继续延伸的,此时可以将对应的 x 和 y 存到 stack 中,stack 中的值为 [(0, 50)]

    在这里插入图片描述

  • y 出现减少

    在这里插入图片描述

    当前情况下,粉色方块的 y 轴受到限制,x 是不可延续的:

    在这里插入图片描述

    因此就需要进行一个退栈的操作,计算粉色 histogram 的最大面积

  • y 保持不变

    这个情况可以单独处理,不过默认作为 y 出现增加 情况处理也行

继续过一遍官方提供的案例加深理解:heights = [2,1,5,6,2,3]

当遍历到第一个值时,stack 为空,没有什么可以进行对比的,因此进行一个入栈的操作:

在这里插入图片描述

当遍历到第二个值 1 时,stack[-1] 的高度无法延伸到当前值,因此进行一个退栈计算面积、对比最大面积、将新的值压入栈中的操作

在这里插入图片描述

注意,这里 🟩 沿用了 🟥 的下标,因为 🟥 的 x 无法延伸到 🟩 ,但是 🟩 的 x 可以反向延伸到 🟥 上:

在这里插入图片描述

所以每次出栈的时候都要获取 stack[-1].x 的值,以供让下一个矮一点的 histogram 去继承

遍历到第三个值 5 时,stack[-1] 可以延伸到下一个 histogram 上,因此只是进行一个入栈的操作:

遍历到第四个值 6 时,stack[-1] 可以延伸到下一个 histogram 上,因此只是进行一个入栈的操作:

在这里插入图片描述

这两个操作一样,因此合并成一张图

当遍历到 2 的时候,再次遇到 y 轴不可眼神的情况,因此要进行连续退栈的操作,因为 stack 中倒数两个值都比当前遇到的 histogram 要大。其面积的计算方式都为 ( c u r r X − s t a c k [ − 1 ] . x ) × y (currX - stack[-1].x) \times y (currXstack[1].x)×y

  • 对于 6 来说,其面积为 ( 4 − 3 ) × 6 (4 - 3) \times 6 (43)×6
  • 对于 5 来说,其面积为 ( 4 − 2 ) × 5 (4 - 2) \times 5 (42)×5
  • 对于 1 来说,它的 y 轴依然可延续,因此不会进行退栈的操作

此时栈的值如下:

在这里插入图片描述

⚠️:上面提到了矮的 histogram 其实是可以反向延长的,因此这里 🟪 占用的是 🟨 的下标

之后重复遍历,一直到完成数组遍历,不过此时 stack 中还是有多余的值的,这个情况下代表 stack 中的 histogram,其 x 轴可以一直延伸到最右端,因此可以用 len(heights) - stack[-1].x 的方法获取其对应的 x,再乘以对应的 y,获得最终面积

代码如下:

class Solution:def largestRectangleArea(self, heights: List[int]) -> int:stack = []max_area = 0for i, h in enumerate(heights):start = iwhile stack and stack[-1][1] > h:prev_i, prev_h = stack.pop()max_area = max(max_area, prev_h * (i - prev_i))start = prev_i# 反向延长 x 轴stack.append((start, h))for i, h in stack:max_area = max(max_area, h * (len(heights) - i))return max_area

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

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

相关文章

微调大型语言模型(一):为什么要微调(Why finetune)?

今天我们来学习Deeplearning.ai的在线课程 微调大型语言模型(一)的第一课:为什么要微调(Why finetune)。 我们知道像GPT-3.5这样的大型语言模型(LLM)它所学到的知识截止到2021年9月,那么如果我们向ChatGPT询问2022年以后发生的事情,它可能会…

diff算法面试题

面试题:请阐述vue的diff算法 参考回答: 当组件创建和更新时,vue均会执行内部的update函数,该函数使用render函数生成的虚拟dom树,将新旧两树进行对比,找到差异点,最终更新到真实dom 对比差异的过…

轻松上手Docker:学习如何创建和运行自己的Docker容器

文章目录 轻松上手Docker:学习如何创建和运行自己的Docker容器容器的介绍Docker的技术架构容器的工作机制(Docker)容器的关键技术 - NamespaceNamespace隔离说明 容器的关键技术 - CgroupDocker环境搭建1)安装基础软件包2&#xf…

python安全工具开发笔记(四)——python网络编程

一、C/S架构 什么是C/S架构 C : Client S : Server。客户机和服务器结构。 Server 唯一的目的就是等待Client 的请求,Client 连上 Server 发送必要的数据,然后等待Server端完成请求的反馈。 C/S网络编程 Server端进行设置,首先创建一个通信…

【unity2023打包安卓工程】踩坑记录

这里写自定义目录标题 踩坑记录使用环境Unity的准备工作Windows10 SDKAndroidstudio第一个需要注意的地方第二个需要注意的地方第三个需要注意的地方第四个需要注意的地方第五个需要注意的地方第六个需要注意的 其他unity启动缓慢 更新更新一 2023.9.27 踩坑记录 踩了快一个星期…

codesys【虚轴】

1概述:codesys里有3个轴: 自由编码器,虚轴,实轴。 流程:【高速输入:采集AB脉冲】带》【自由编码器】带》【虚轴】带》【实轴】 1虚轴: 用法和实轴一样。 一般用于,一拖多。 2编…

GEO生信数据挖掘(二)下载基因芯片平台文件及注释

检索到目标数据集后,开始数据挖掘,本文以阿尔兹海默症数据集GSE1297为例 目录 下载平台文件 1.AnnotGPL参数改为TRUE,联网下载芯片平台的soft文件。(国内网速奇慢经常中断) 2.手工去GEO官网下载 转换芯片探针ID为gene name 拓…

u盘初始化后怎么恢复文件?这几步操作帮你找回

随着科技的进步和便携设备的普及,U盘已经成为我们日常工作和生活中不可缺少的存储介质。然而,在使用U盘的过程中,我们可能会遇到各种问题,其中之一就是意外的初始化导致文件丢失。本文将为大家介绍如何在U盘初始化后恢复文件的方法…

Jenkins学习笔记4

配置构建流程: Jenkins任务创建: 1)创建新任务: 把这个Accept first connection改成 No Validation。问题得到解决。 说明下,要确认下主分支的名称是master还是main。 构建触发器这块暂时没有需要配置的。 传输文件…

【yolov1】详解yolov1理论 代码

目标检测要解决的3大问题: 1、有没有? 图片中是否有要检测的物体?(检测物体,判定前景背景) 2、是什么? 这些物体分别是什么?(检测到的物体是什么) 3、在…

vuereact质检工具(eslint)安装使用总结

1、ESLint ESLint工具主要类似java中的checkStyle和findbugs,是检查代码样式和逻辑规范的工具。 1.1、ESLint安装流程 打开VSCode软件,打开扩展中心,下载ESLint插件 图1.1 点击后面的install按进行安装,如图1.2所示&#xff1…

单元测试

一、什么是单元测试 二、Junit单元测试框架 三、如何使用Junit单元测试框架 package study.StringUtils;public class StringUtil {public static void printNumber(String name){if (namenull){System.out.println ("名字的长度是:0");return;}System.ou…

性能测试监控-java分析工具Arthas

Arthas监控docker中的jvm_ray_my的博客-CSDN博客 Quick Start | arthas arthas是什么 Arthas是阿里巴巴开源的Java诊断工具,它可以帮助开发人员快速、方便地定位和解决Java应用的问题。 Arthas主要包括以下功能: 诊断Java应用中的性能问题&#xff…

天眼查询企业信息API接口

"天眼"一般是指"天眼查",这是一个提供全国企业信息查询的API接口。天眼查以"天眼"作为用户logo,基于人工智能算法的数据采集和分析技术,为企业和个人提供全量、精准、实时、权威的企业信息查询服务。 天眼查A…

国产5G手机20天销量不及苹果一天,被iPhone15按在地上摩擦

iPhone15的上市销售,最大竞争对手无疑是国产5G手机,如今iPhone15上市首日的销量数据也已经出炉,高达200万台,这比国产5G手机卖20天的销量还要多,iPhone15让国产手机领教了什么叫遥遥领先。 据了解苹果对iPhone15的预期…

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组 试题 A: 子 2023

[蓝桥杯 2023 国 B] 子 2023 试题 A: 子 2023 【问题描述】 小蓝在黑板上连续写下从 1 1 1 到 2023 2023 2023 之间所有的整数,得到了一个数字序列: S 12345678910111213 ⋯ 20222023 S 12345678910111213\cdots 20222023 S12345678910111213⋯2…

[React] React高阶组件(HOC)

文章目录 1.Hoc介绍2.几种包装强化组件的方式2.1 mixin模式2.2 extends继承模式2.3 HOC模式2.4 自定义hooks模式 3.高阶组件产生初衷4.高阶组件使用和编写结构4.1 装饰器模式和函数包裹模式4.2 嵌套HOC 5.两种不同的高阶组件5.1 正向的属性代理5.2 反向的继承 6.如何编写高阶组…

第5章 网络编程

5.1 OSI模型有哪几层?以及各自的作用 难度:★ 重点:★ 白话解析 无它,唯记尔;实在记不住也需要有个印象。 参考答案 OSI(Open System Interconnection):开放式系统互联参考模型。它分为7层,自顶而下分别是:应用层、表示层、会话层、传输层、网络层、数据链路层和物…

【数据结构与算法】 - 时间复杂度和空间复杂度、二分查找、线性查找

数据结构与算法 1. 数据结构的定义2. 二分查找2.1 二分查找的定义2.2 二分查找分析2.3 二分查找实现2.4 二分查找算法图解2.5 二分算法引发的问题2.6 二分算法改良版2.7 二分算法改良版解析2.8 二分算法改良版图解2.9 二分算法改良版注意事项 3. 时间复杂度3.1 时间复杂度的概念…

【c语言中数组和指针的联系】

C语言中的数组和指针之间存在紧密的联系,因为数组名本质上就是指向数组首元素的指针。这种联系使得在处理数组时可以像处理指针一样操作,同时也使得数组和指针可以互相转换。 下面详细说明数组和指针之间的联系,并提供一些示例来演示这种联系…