力扣_数组25—柱状图中最大的矩形

题目

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

思路

  • 暴力法:
    • 有下述事实:最大矩形的高度一定等于某个柱子的高度
    • 遍历每个柱子(对于柱子 i i i,其高度为 h e i g h t s [ i ] heights[i] heights[i]),计算当矩形高度等于 h e i g h t s [ i ] heights[i] heights[i] 时所能构成的矩形的最大面积
      • 找到第 i i i 个柱子向左向右所能延申的最大宽度,即找到左边第一个小于 h e i g h t s [ i ] heights[i] heights[i] 的柱子(假设索引为 l l l)和右边第一个小于 h e i g h t s [ i ] heights[i] heights[i] 的柱子(假设索引为 r r r
      • 此时的最大矩形面积: h e i g h t s [ i ] ∗ ( r − l − 1 ) heights[i]*(r-l-1) heights[i](rl1)
  • 如何更快的找到每个柱子左边/右边第一个小于它的柱子:
    • 单调栈
      • 本题考的基础模型其实就是:在一维数组中对每一个数找到第一个比自己小的元素。这类“在一维数组中找第一个满足某种条件的数”的场景就是典型的单调栈应用场景。
      • 从左到右遍历数组,如果当前遍历到的数大于栈顶元素,则将当前遍历到的数入栈;如果当前遍历到的数小于等于栈顶元素,不断的将栈顶元素出栈直到栈顶元素小于该数。保证了栈中元素的单调性。
      • 对于本题,栈中存放索引,栈中索引对应的数组中的数是单调的。每次遍历时,栈顶的数即为待求的第一个小于自己的索引;从左到右和从右到左分别遍历即可得到每个柱子左边/右边第一个小于它的柱子
      • 优化:上面是左到右右到左遍历两次,可以优化到一次
        • 假设当前遍历到 i i i,栈顶元素不满足条件需要出栈,此时出栈的元素对应的柱子的右边第一个小于等于它的柱子即为 i i i 对应的柱子
        • 注意到上述方法找到的不是第一个小于它的柱子,而是第一个小于等于它的柱子。但这对最后的结果没有影响:由于等高数列的最后一个数的左边界和中间算错的部分的左边界相同,因此会覆盖掉中间的错误部分,计算面积的时候是对的。

代码

class Solution {
public:int largestRectangleArea(vector<int>& heights) {// int n = heights.size();// stack<int> stk;// stk.push(-1);// vector<int> l2r;// vector<int> r2l;// for(int i = 0; i < n; i++){//     while(stk.top() != -1 && heights[i] <= heights[stk.top()]){//         stk.pop();//     }//     l2r.push_back(stk.top());//     stk.push(i);// }// while (!stk.empty()){//     stk.pop();// }// stk.push(n);// for(int i = n-1; i >= 0; i--){//     while(stk.top() != n && heights[i] <= heights[stk.top()]){//         stk.pop();//     }//     r2l.push_back(stk.top());//     stk.push(i);// }// int ret = 0;// for(int i = 0; i < n; i++){//     ret = max(ret, heights[i]*(r2l[n-1-i]-l2r[i]-1));// }// return ret;int n = heights.size();stack<int> stk;stk.push(-1);vector<int> l2r;int ret = 0;for(int i = 0; i < n; i++){while(stk.top() != -1 && heights[i] <= heights[stk.top()]){ret = max(ret, heights[stk.top()]*(i-l2r[stk.top()]-1));stk.pop();}l2r.push_back(stk.top());stk.push(i);}while(stk.top() != -1){ret = max(ret, heights[stk.top()]*(n-l2r[stk.top()]-1));stk.pop();}return ret;}
};

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

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

相关文章

简易学生管理系统-----------查看学生信息

code: --------------------------------- import java.util.ArrayList; import java.util.Scanner;public class StudentManager {public static void main(String[] args) {//创建集合对象&#xff0c;用于存储学生数据】ArrayList<Student> array new ArrayList<…

ReactHooks:渲染与useState

渲染和提交 组件显示到屏幕之前&#xff0c;必须被 React 渲染。主要需要经历以下三个步骤&#xff1a; 步骤1&#xff1a; 触发一次渲染 有两种原因会导致组件的渲染&#xff1a; 组件的初次渲染组件&#xff08;或其父组件&#xff09;的状态发生改变而触发重新渲染 当应…

Element|Upload结合Progress实现上传展示进度条

背景 &#xff1a; 项目里的 附件上传 题型组件&#xff0c;用户在上传过程中&#xff0c;如果文件较大&#xff0c;上传过程较慢&#xff0c;而又没有一个类似 Loading... 的加载过程的话&#xff0c;会显得干愣愣的&#xff0c;用户体验较差&#xff0c;所以需要添加一个进度…

SpringBoot外部配置文件

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

【Docker Compose】案例分享

Docker Compose 是一个工具,允许你使用 YAML 文件来定义和运行多个 Docker 容器。它简化了多容器应用的部署和管理。 创建 Docker Compose 文件 Docker Compose 使用 docker-compose.yml 文件来描述服务、网络和卷等配置。以下是一个简单的例子: version: 3 services:web:…

《Training language models to follow instructions》论文解读--训练语言模型遵循人类反馈的指令

目录 1摘要 2介绍 方法及实验细节 3.1高层次方法论 3.2数据集 3.3任务 3.4人体数据收集 3.5模型 3.6评价 4 结果 4.1 API分布结果 4.2公共NLP数据集的结果 4.3定性结果 问题 1.什么是rm分数 更多资料 1摘要 使语言模型更大并不能使它们更好地遵循用户的意图。例…

if单分支,二分支,多分支,语句嵌套,while语句,for语句(Python实现)

一、主要目的&#xff1a; 1&#xff0e;熟悉程序设计结构的三种方式 2.掌握if单分支语句、if二分支语句、if多分支语句及if语句嵌套的使用方法 3.掌握while语句的使用方法 4.掌握for语句的使用方法 5.掌握循环嵌套的使用方法 二、主要内容和结果展现&#xff1a; 1&…

C++ : 类

文章目录 类前置声明构造函数拷贝构造函数 类 类的数据成员不能在声明类时初始化。 一个对象所占的空间大小只取决于该对象中数据成员所占的空间&#xff0c;而与成员函数无关。 成员函数代码是存储在对象空间之外的。 在类中定义的成员函数的规模一般都很小&#xff0c;而系…

Spark on Hive及 Spark SQL的运行机制

Spark on Hive 集成原理 HiveServer2的主要作用: 接收SQL语句&#xff0c;进行语法检查&#xff1b;解析SQL语句&#xff1b;优化&#xff1b;将SQL转变成MapReduce程序&#xff0c;提交到Yarn集群上运行SparkSQL与Hive集成&#xff0c;实际上是替换掉HiveServer2。是SparkSQL…

Handsfree_ros_imu:ROS机器人IMU模块ARHS姿态传感器(A9)Liunx系统Ubuntu20.04学习启动和运行教程

这个是篇学习 Handsfree_ros_imu 传感器的博客记录 官方教程链接见&#xff1a; https://docs.taobotics.com/docs/hfi-imu/ 产品功能 IMU 内有 加速度计&#xff0c;陀螺仪&#xff0c;磁力计这些传感器&#xff0c;通过固定 imu 到物体上后&#xff0c;可以获取物体在运动…

Python OpenCv中调用cv2.selectROI( )函数提取图像中指定区域(高效抠图)

目录 一、cv2.selectROI()函数参数二、代码三、提取结果四、总结 一、cv2.selectROI()函数参数 下面是cv2.seletROI()函数中各个参数的解析&#xff1a; selectROI(windowName, img, showCrosshairNone, fromCenterNone):. 参数windowName&#xff1a;选择的区域被显示在的…

(Java企业 / 公司项目)配置Gateway + Nacos应用名路由转发?

首先看项目的gateway&#xff0c; 没有进行路由转发的时候的缺点 在gateway模块中的配置的路径都是写死的&#xff0c;到时候我们更改了IP地址又要改这个代码&#xff0c;会很麻烦所以我们应该怎么样做才能使得请求更加方便&#xff1f;这是子模块 在我们请求模块member中配置…

x-cmd pkg | llm - 用于与 OPENAI 交互的命令行工具

目录 简介首次用户功能特点进一步探索 简介 llm 是一个命令行工具和 Python 库&#xff0c;用于与大型语言模型&#xff08;Large Language Models&#xff0c;简称 LLMs&#xff09;交互&#xff0c;既可以通过远程 API 访问&#xff0c;也可以在本地机器上运行安装的模型。由…

游戏辅助从0到1-C++调用游戏Lua脚本实现辅助

课程地址&#xff1a;https://edu.csdn.net/course/detail/39240 你将收获 游戏辅助编程 Lua基础 C/CLua联合编程 适用人群 对游戏辅助技术感兴趣的人 课程介绍 本课程以TLB*和W*W为例子&#xff0c;讲述如何通过游戏的Lua脚本来实现一个游戏的辅助。众所周知&#xff…

蚁群算法解决旅行商问题的完整Python实现

蚁群算法&#xff08;Ant Colony Optimization&#xff0c;简称ACO&#xff09;是一种模拟蚂蚁觅食行为的启发式优化算法。它通过模拟蚂蚁在寻找食物时释放信息素的行为&#xff0c;来解决组合优化问题&#xff0c;特别是旅行商问题&#xff08;TSP&#xff09;。 蚁群算法的基…

C#.Net学习笔记——设计模式六大原则

***************基础介绍*************** 1、单一职责原则 2、里氏替换原则 3、依赖倒置原则 4、接口隔离原则 5、迪米特法原则 6、开闭原则 一、单一职责原则 举例&#xff1a;类T负责两个不同的职责&#xff1a;职责P1&#xff0c;职责P2。当由于职责P1需求发生改变而需要修…

Kotlin 1.7.0 beta发布,改进构建器类型推断

Kotlin 1.7.0是JetBrains的跨平台、多用途编程语言的计划新版本&#xff0c;目前已进入beta发布阶段&#xff0c;主要特点是对构建器类型推断和新的内存管理器进行了更改。 改进编写泛型构建器时的构建器类型推断 构建器推断是调用泛型构建器函数时的一种特殊类型推断&#xf…

Gorm实战,轻松掌握数据库增删改查技巧!

Gorm实战&#xff0c;轻松掌握数据库增删改查技巧&#xff01; CRUD通常指数据库的增删改查操作&#xff0c;本文详细介绍了如何使用GORM实现创建、查询、更新和删除操作。 文章目录 Gorm实战&#xff0c;轻松掌握数据库增删改查技巧&#xff01;一、Create&#xff08;创建&a…

综合智慧能源监测管理平台,实现能源管理“透明”化

能源问题是全球面临的最大问题&#xff0c;在提高经济增长的同时&#xff0c;也引发了能源供应危机及环境严重等问题&#xff0c;降低能源管理、低碳环保是我们未来发展的必经之路。 为了解决这一问题&#xff0c;智慧能源管理平台应运而生。平台采用微服务架构&#xff0c;整…

内存溢出和内存泄露的区别

这道题是面试常考的&#xff0c;一定要区分好区别&#xff0c;我之前就是直接认为内存溢出就是内存泄漏了 概念 内存溢出&#xff1a;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用。比如&#xff0c;申请了一个整数的内存&#xff0c;但实际存了一个需要 lon…