Leecode热题100-84.柱状图中的最大矩形

给定 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

思路都在代码注释里,自己看,看不懂的留言或者私信,看到第一时间解答

class Solution {/**这个题第一感觉是用的单调栈的解法,这个最大的矩形必定以某一个柱子的高度为最低高度我们对于每个柱子,求出它左边第一个比它小的(left)和右边第一个比它小的(right)则right-left-1就是以这个柱子为最低高度的矩形的宽度所有的这些宽度*高度里的最大值就是我们的答案*/public int largestRectangleArea(int[] heights) {/**如果只有一个,那没啥说的,返回它的高度就行了,因为它的宽度是1 */if(heights.length == 1) {return heights[0];}/**如果是两个,我们可以特殊处理也可以不特殊处理,这里我不特殊处理了,直接用单调栈来处理单调栈的核心是nearLess数组,我们使用单独的方法去求这个*/int[][] nearLess = getNearLess(heights);/**有了这个数组之后我们就可以直接比较求答案了 */int ans = 0;for(int i = 0; i < heights.length; i++) {/**我们这里left和right可以直接用,因为我们在getNearLess里已经取巧处理了 */int left = nearLess[i][0];int right = nearLess[i][1];ans = Math.max(ans, (right - left - 1) * heights[i]);}return ans;}public int[][] getNearLess2(int[] heights) {/**定义返回结果 */int[][] nearLess = new int[heights.length][2];/**定义单调栈,我们栈里的数据是栈底到栈顶依次变大的,也就是栈顶是最小值,如果出现更小的就把大的弹出 */Stack<Integer> minStack = new Stack<>();/**遍历数组依次入栈 */for(int i = 0; i < heights.length; i++) {while(!minStack.isEmpty() && heights[minStack.peek()] > heights[i]) {/**把大的弹出 */int popIndex = minStack.pop();/**i是造成popIndex这个数弹出的,也就是右边第一个小于它的数的下标 */nearLess[popIndex][1] = i;/**popIndex左边第一个比它小的是它压着的,如果下面没了(栈空了),就写-1*/nearLess[popIndex][0] = minStack.isEmpty()? -1 : minStack.peek();}/**当前已经满足放入的条件了,放入当前数 */minStack.push(i);}/**结算栈中剩余的元素 */while(!minStack.isEmpty()) {int popIndex = minStack.pop();/**剩余需要结算的数右边没有比它小的,这里就写heigths.length了,这里是为了主方法计算方便,一般别的地方我写-1 */nearLess[popIndex][1] = heights.length;/**popIndex左边第一个比它小的是它压着的,如果下面没了(栈空了),就写-1*/nearLess[popIndex][0] = minStack.isEmpty()? -1 : minStack.peek();}return nearLess;}public int[][] getNearLess(int[] heights) {/**定义返回结果 */int[][] nearLess = new int[heights.length][2];/**定义单调栈,我们栈里的数据是栈底到栈顶依次变大的,也就是栈顶是最小值,如果出现更小的就把大的弹出,这里我替换成数组用于节约常数时间 */int[] minStack = new int[heights.length];int stackSize = 0;/**遍历数组依次入栈 */for(int i = 0; i < heights.length; i++) {while(stackSize != 0 && heights[minStack[stackSize - 1]] > heights[i]) {/**把大的弹出 */int popIndex = minStack[--stackSize];/**i是造成popIndex这个数弹出的,也就是右边第一个小于它的数的下标 */nearLess[popIndex][1] = i;/**popIndex左边第一个比它小的是它压着的,如果下面没了(栈空了),就写-1*/nearLess[popIndex][0] = stackSize == 0? -1 : minStack[stackSize - 1];}/**当前已经满足放入的条件了,放入当前数 */minStack[stackSize++] = i;}/**结算栈中剩余的元素 */while(stackSize != 0) {int popIndex = minStack[--stackSize];/**剩余需要结算的数右边没有比它小的,这里就写heigths.length了,这里是为了主方法计算方便,一般别的地方我写-1 */nearLess[popIndex][1] = heights.length;/**popIndex左边第一个比它小的是它压着的,如果下面没了(栈空了),就写-1*/nearLess[popIndex][0] = stackSize == 0? -1 : minStack[stackSize - 1];}return nearLess;}
}

 

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

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

相关文章

Python核心知识:pip使用方法大全

什么是 pip&#xff1f; pip 是 Python 的包管理工具&#xff0c;允许用户安装、升级和管理 Python 的第三方库和依赖。它极大地简化了开发过程&#xff0c;使开发者可以轻松地获取并安装所需的软件包。pip 已成为 Python 项目中最常见的包管理工具&#xff0c;并且自 Python …

SQL第10课挑战题

1. 从OrderItems表中返回每个订单号order_num各有多少行数order_lines&#xff0c;并按order_lines对结果进行排序 2. 返回名为cheapest_item的字段&#xff0c;该字段包含每个供应商成本最低的产品&#xff08;使用products表中的prod_price)&#xff0c;然后从最低成本到最高…

房屋水电费:重新布局,重构JS代码

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>房租水电费</title><script type"…

计算机网络:计算机网络概述:网络、互联网与因特网的区别

文章目录 网络、互联网与因特网的区别网络分类 互联网因特网基于 ISP 的多层次结构的互连网络因特网的标准化工作因特网管理机构因特网的组成 网络、互联网与因特网的区别 若干节点和链路互连形成网络&#xff0c;若干网络通过路由器互连形成互联网 互联网是全球范围内的网络…

「安装」 Windows下安装CUDA和Pytorch

「安装」 Windows下安装CUDA和Pytorch 文章目录 「安装」 Windows下安装CUDA和PytorchMac、Linux、云端Windows安装CUDA安装miniconda安装PyTorch测试总结 其他 Mac、Linux、云端 Mac、Linux、云端安装Miniconda和Pytorch的方法参考其他资料。 Windows 下面进行Windows下安装…

VB.net读写NDEF标签URI智能海报WIFI蓝牙连接

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 Public Class Form1Dim oldpicckey(0 To 5) As Byte 卡片旧密码Dim newpicckey(0 To 5) As Byte 卡片新密码Function GetTagUID() As StringDim status As ByteDim myctrlword As …

Python编程和开发过程中让人编程效率和舒适度很高的工具Anaconda

编程工作为什么需要提高效率&#xff1f; 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。 那么&#xff0c;编写python代码过程中…

c#使用winscp库实现FTP/SFTP/SCP的获取列表、上传和下载功能

网上写c#调用winscp实现的资料很少&#xff0c;且写的不够详细。本人查了下winscp的libraries说明&#xff0c;写了个小工具&#xff0c;供大家参考。 winscp的接口说明地址如下&#xff1a; WinSCP .NET Assembly and COM Library :: WinSCP 一、先展示一下小工具的界面 1、…

资源《Arduino 扩展板3-WS2812》说明。

资源链接&#xff1a; Arduino 扩展板3-WS2812 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程&#xff0c;采用AD做的。 该文件打板后配合Arduino使用&#xff0c;属于Arduino的扩展板。 该文件主要…

AI助力CMIP6数据处理技术及在气候变化、生态农业、水文多领域实践应用

查看原文>>>AI助力CMIP6数据处理技术及在气候变化、生态农业、水文多领域实践应用 目录 专题一 CMIP6中的模式比较计划 专题二 数据下载 专题三 基础知识3.1 Python基础 专题四 单点降尺度 专题五 统计方法的区域降尺度 专题六 基于WRF模式的动力降尺度 专题七…

RabbitMQ的相关题

一、 MQ的作⽤及应⽤场景 类似问题: 项⽬什么场景下使⽤到了MQ, 为什么需要MQ? RabbitMQ 的作⽤?使⽤场景有哪些? RabbitMQ…

【Linux】第一个小程序——进度条实现

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…

Docker仓库搭建

目录 一、Docker Hub 二、私有Registry仓库搭建 1、下载并开启仓库镜像registry 2、Registry加密传输 3、建立一个registry仓库 4、为客户端建立证书 5、测试 6、为仓库建立登录认证 三、Harbor仓库搭建 Docker 仓库&#xff08;Docker Registry&#xff09; 是用于存…

PHP程序如何实现限制一台电脑登录?

PHP程序如何实现限制一台电脑登录&#xff1f; 可以使用以下几种方法&#xff1a; 1. IP地址限制&#xff1a;在PHP中&#xff0c;可以通过获取客户端的IP地址&#xff0c;然后与允许登录的IP地址列表进行比对。如果客户端的IP地址不在列表中&#xff0c;就禁止登录。 “php $…

快速创建第一个Spring Boot 项目

一、介绍 Spring Boot 是一个开源的 Java 基础框架&#xff0c;它基于 Spring 框架&#xff0c;用于创建独立、生产级别的基于 Spring 的应用程序&#xff0c;你可以“跑起来”&#xff08;run&#xff09;你的 Spring 应用程序。Spring Boot 让基于 Spring 的应用开发变得更容…

基于单片机的两轮直立平衡车的设计

本设计基于单片机设计的两轮自平衡小车&#xff0c;其中机械部分包括车体、车轮、直流电机、锂电池等部件。控制电路板采用STC12C5A60S2作为主控制器&#xff0c;采用6轴姿态传感器MPU6050测量小车倾角&#xff0c;采用TB6612FNG芯片驱动电机。通过模块化编程完成了平衡车系统软…

leetcode:380. O(1) 时间插入、删除和获取随机元素

实现RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#xff0c;返回 false 。bool remove(int val) 当元素 val 存在时&#xff0…

前端框架对比和选择指南

前端框架对比和选择指南 随着 Web 开发技术的快速发展&#xff0c;前端框架已经成为了现代 Web 开发的核心工具之一。它们为开发人员提供了快速构建高效、交互性强的应用的基础。当前流行的前端框架主要包括 React.js、Vue.js 和 Angular.js。在这篇技术博客中&#xff0c;我们…

如何创建一个docker,给它命名,且下次重新打开它

1.创建一个新的docker并同时命名 docker run -it --name one ubuntu:18.04 /bin/bash 这时候我们已经创建了一个docker,并且命名为"one" 2.关闭当前docker exit 3.这时docker已经终止了&#xff0c;我们需要使用它要重新启动 docker start one 4.现在可以重新打…

react crash course 2024(7) react router dom

安装 npm i react-router-dom 引入 import {Route,createBrowserRouter,createRoutesFromElements,RouterProvider} from react-router-dom 在app.jsx const router createBrowserRouter(createRoutesFromElements(<Route index element {<h1>My App</h1>…