想要精通算法和SQL的成长之路 - 柱状图中最大的矩形

news2025/1/17 1:08:00

想要精通算法和SQL的成长之路 - 柱状图中最大的矩形

  • 前言
  • 一. 柱状图中最大的矩形

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 柱状图中最大的矩形

原题链接

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。

在这里插入图片描述
这道题目我们可以仿照着接雨水这道题目来做。

思路:

  1. 我们可以遍历所有的柱子,在每次遍历的时候,我们以当前柱子作为一个中心点。
  2. 我们分别向左、向右各自寻找第一个小于当前高度的柱子,找到他们的索引分别是leftright
  3. 那么以当前柱子为固定高度的最大面积就是 :(right-left-1)* curHeight

那么我们来看下题目给的案例,按按照这个思想来做是否可行呢?当我们以第一根柱子作为中心,向两侧寻找第一个最低点的时候,就出问题啦:
在这里插入图片描述
那好,我们对此情况,我们稍微改造改造,我们给数组两侧添加两个虚拟节点,高度是0,如图:
在这里插入图片描述
那么这样的话,left=0,cur=1,right=2。以高度为2去寻找最大面积的话,就是2*(2-0-1)=2了。

我们再来看下以柱子高度5的为中心:
在这里插入图片描述

我们在试想一下,既然我们要以每个遍历的节点为中心,并寻找到左右两侧第一个比他小的元素。那么我们就可以使用单调递增栈来完成。

前期准备部分,我们先给数组添加两个虚拟节点

int[] tmpHeight = new int[heights.length + 2];
for (int i = 1; i <= heights.length; i++) {
    tmpHeight[i] = heights[i - 1];
}

然后我们再看看递归过程:

  • 既然我们需要单调递增,那么遇到小的,就应该把当前栈内比当前高度高的,给剔除(同时计算高度)。也就保证了循环:while (!stack.isEmpty()&&tmpHeight[stack.peek()]>tmpHeight[right])因为无论怎么样,我们必须要把当前元素给放到栈中的。不能不放。
  • 既然是单调递增栈,那么栈顶元素和栈中的第二个元素就是我们要的中心元素、左侧第一个比栈顶元素小的。而当前元素就是右侧第一个比栈顶元素小的。看图能更直观点(红框部分),这时候遍历的时候,栈中元素有0和2,当遇到1的时候,满足while条件。
    在这里插入图片描述
for (int right = 0; right < tmpHeight.length; right++) {
    // 一旦遇到某个节点比当前节点小了,就可以计算面积了。
    while (!stack.isEmpty() && tmpHeight[stack.peek()] > tmpHeight[right]) {
        // 栈顶元素(也就是我们说的中心柱子)
        int current = stack.pop();
        // left是左侧第一个比中心柱子矮的,right就是右侧第一个比中心柱子高的,
        // 因为在tmpHeight[stack.peek()] > tmpHeight[right]的前提约束下
        Integer left = stack.peek();
        // 计算面积
        res = Math.max(res, (right - left - 1) * tmpHeight[current]);
    }
    stack.push(right);
}

最终代码如下:

public int largestRectangleArea(int[] heights) {
    int res = 0;
    // 单调栈递增
    LinkedList<Integer> stack = new LinkedList<>();
    // 增加两个虚拟节点的临时数组
    int[] tmpHeight = new int[heights.length + 2];
    for (int i = 1; i <= heights.length; i++) {
        tmpHeight[i] = heights[i - 1];
    }
    for (int right = 0; right < tmpHeight.length; right++) {
        // 一旦遇到某个节点比当前节点小了,就可以计算面积了。
        while (!stack.isEmpty() && tmpHeight[stack.peek()] > tmpHeight[right]) {
            // 栈顶元素(也就是我们说的中心柱子)
            int current = stack.pop();
            // left是左侧第一个比中心柱子矮的,right就是右侧第一个比中心柱子高的,
            // 因为在tmpHeight[stack.peek()] > tmpHeight[right]的前提约束下
            Integer left = stack.peek();
            // 计算面积
            res = Math.max(res, (right - left - 1) * tmpHeight[current]);
        }
        stack.push(right);
    }
    return res;
}

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

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

相关文章

你是真的“C”——操作符详解【下篇】+整形提升+算术转换

你是真的“C”——操作符详解下篇&#x1f60e;前言&#x1f64c;操作符详解【上篇】内容&#xff1a;操作符详解【下篇】内容&#xff1a;1、 条件操作符2、逗号表达式&#xff1a;3、下标引用、函数调用和结构成员3、访问一个结构的成员表达式求值1、隐式类型转换&#xff1a…

扫雷——C语言【详解+全部码源】

前言&#xff1a;今天我们学习的是C语言中另一个比较熟知的小游戏——扫雷 下面开始我们的学习吧&#xff01; 文章目录游戏整体思路游戏流程游戏菜单的打印创建数组并初始化布置雷排查雷完整代码game.hgame.ctest.c游戏整体思路 我们先来看一下网上的扫雷游戏怎么玩 需要打印…

Imported target “dart“ includes non-existent path 笔记

详细问题&#xff1a;关联功能包&#xff0c;源码编译Failed <<< gazebo_ros2_control [11.8s, exited with code 1]网上查了很多资料&#xff0c;都是比较旧版&#xff0c;这里注意由于ROS2系统发展很快&#xff0c;功能包在快速集成。使用源码编译可能会遇到环境配置…

PMP报考条件?

PMP已经被认为是项目管理专业身份的象征&#xff0c;项目经理人取得的重要资质。 PMP考试一般每年在中国大陆地区&#xff0c;会进行四次考试&#xff0c;今天就来详细说一说PMP考试的时间线。 01考试时间PMP考试在中国大陆一年开展四次&#xff0c;分别在每年的3月、6月、9月…

SpringCloud(17):Sentinel简介

1 流量控制&熔断降级介绍 1.1 流量控制简介 拿旅游景点举个示例&#xff0c;每个旅游景点通常都会有最大的接待量&#xff0c;不可能无限制的放游客进入&#xff0c;比如故宫每天只卖八万张票&#xff0c;超过八万的游客&#xff0c;无法买票进入&#xff0c;因为如果超过…

软件架构设计(二)——领域架构、基于架构的软件开发方法

目录 一、架构描述语言 ADL 二、特定领域软件架构 DSSA 三、DSSA的三层次架构模型 . 四、基于架构的软件开发方法 (1)基于架构的软件设计(ABSD) (2)开发过程 一、架构描述语言 ADL ADL是一种形式化语言&#xff0c;它在底层语义模型的支持下&#xff0c;为软件系统概念体…

云安全之浅谈密钥泄露

前言 如今越来越多公司选择使用云平台&#xff0c;诸如:阿里云、腾讯云、AWS、Azure。使用云平台大大降低了企业的资源成本&#xff0c;另一方面随着公用云的普及&#xff0c;也存在着一些风险。现代应用程序需要与其他外部应用程序通信&#xff0c;并且它们需要内部服务到服务…

ESP32设备驱动-模拟输入(ADC)

模拟输入(ADC) 文章目录 模拟输入(ADC)1、ADC介绍2、ADC相关API介绍3、软件准备4、硬件准备5、代码实现本文将介绍如何使用Arduino IDE对ESP32进行模拟读取。模拟读数可用于从可变电阻式电位计或模拟传感器读取值。 1、ADC介绍 ESP32有两个ADC单元,可用于以下场景: 生成…

Echarts的Category轴滑动

Echarts的Category轴滑动 效果&#xff0c;滚轮上下可拖动 配置项 dataZoom: [// {// // disabled: false,// start: 100, //默认为0// end: 80, //默认为100// // startValue: [xArr.length - 1],// // endValue: [xArr.length - 4],// type: slide…

typora每次复制文档都要附带图片文件夹?学会配置gitee图床

0. 引言 作为开发人员&#xff0c;我们习惯使用md格式来编写文档&#xff0c;特别是typora编辑器更是日常使用的软件。但作为轻量化的文档编辑器&#xff0c;我们在默认插入图片时&#xff0c;一般typora会将图片保存到本地或者引用一个本地图片的路径 当文档还在我们本地打开…

免费IB学习资源推荐,学霸常用

看了那些学霸们分享的笔记与网站&#xff0c;深刻认识到学习的竞争&#xff0c;就是对个人资源归纳整理能力的比拼&#xff0c;想要学好IB学科&#xff0c;除了跟着自己的辅导老师积极学习以外&#xff0c;还要学会充分掌握学习资料&#xff0c;这样才能做到心中有数&#xff0…

超清遥感影像语义分割处理

分割出城市中的垃圾堆场,遂寻找到了 UrbanAtlas 2012 database 这个数据集和对应的 baseline baseline IoU for class 1: 0.5667 IoU for class 2: 0.3504 IoU for class 3: 0.0001 IoU for class 4: 0.0002 IoU for class 5: 0.4121 IoU for class 6: 0.0204 IoU for cla…

第三章:IP地址加掩码讲解和ping命令运用

IP地址加掩码&#xff1a;我打几个IP地址给你们瞅瞅。10.20.70.55/24192.168.30.2/24我写的这几个都是24位掩码的&#xff0c;/后面的是掩码位数&#xff0c;也就是是255.255.255.0。子网掩码分为三类&#xff1a;A类&#xff1a;255.0.0.0B类&#xff1a;255.255.0.0C类&#…

RMIserver端和Registry端源码分析

想学JDNI&#xff0c;那想必一定躲不过RMI。 RMI简述 RMI可以远程调用JVM对象并获取结果。所以需要一个server和一个client进行通信。 Server端会创建一个远程对象用于client端远程访问。 下面改造一张来自W3Cschool的图&#xff1a; 只需要知道&#xff1a;Client端使用st…

UE5 UI材质特效

一、扩散的光圈。效果如下&#xff1a;用ps拉一个 对称渐变 和 径向渐变对称渐变&#xff1a;用于做纹理&#xff0c;通过平面坐标到极坐标的公式&#xff0c;转换成环。径向渐变&#xff1a;用于Mask将贴图的纹理组改为 UI&#xff0c;压缩设置改为 用户界面2D。创建材质 M_Te…

Myb atis基础3

Mybatis注解开发单表操作Mybatis的常用注解Mybatis的增删改查MyBatis注解开发的多表操作MyBatis的注解实现复杂映射开发一对一查询一对多查询多对多查询构建sqlsql构建对象介绍查询功能的实现新增功能的实现修改功能的实现删除功能的实现Mybatis注解开发单表操作 Mybatis的常用…

【运筹优化】Python 实现标签算法求解 ESPPRC 问题

文章目录一、标签算法介绍二、SPPRC 问题三、ESPPRC 问题四、Python 实现标签算法求解 ESPPRC 问题4.1 Solomn 数据集4.2 完整代码4.2.1 Functions.py4.2.2 LabelAlgo.py4.2.3 Main.py4.3 结果展示4.3.1 测试案例&#xff1a;c101.txt4.3.2 测试案例&#xff1a;r101.txt一、标…

2022年38女神节大促美妆、珠宝、母婴、保健电商数据回顾

近期&#xff0c;我们陆续接收到了品牌商家朋友们对于2022年女神节大促期间部分品类的数据需求&#xff0c;希望能对今年的大促活动有一个更宏观的认知、更精准的预测&#xff0c;从而拿到更好的数据效果。 为此&#xff0c;在距离大促开启一个月的备货阶段&#xff0c;鲸参谋决…

ChatGPT真的像媒体宣传的那样“四平八稳”吗?

最近ChatGPT非常的火爆&#xff0c;曝光度很高&#xff0c;很多官方媒体和个人的自媒体公众号都进行各种追逐。有些文案写的太好了&#xff0c;真的都要信了。其中有一篇“遨游四海&#xff0c;惊艳于某州”类似旅游宣传的文案。为了测试一下于是仿照他们的问话方式对ChatGPT进…

【服务器数据恢复】服务器raid5故障导致lvm结构损坏的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器内搭建2组raid5磁盘阵列&#xff0c;每组raid5阵列包含4个磁盘&#xff0c;2组阵列都划分为lun并组为lvm结构&#xff0c;采用的ext3文件系统。 服务器故障&#xff1a; 一直raid5磁盘阵列中的一块硬盘由于未知故障离线&#xff0c;此时该…