【栈】Leetcode 84. 柱状图中最大的矩形【困难】

柱状图中最大的矩形

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

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

示例 1:

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

解题思路

  • 1、使用单调栈解决问题。
  • 2、遍历柱状图的高度数组,对于每个柱子的高度:
  •  如果栈为空或者当前柱子的高度大于等于栈顶柱子的高度,则将当前柱子的索引入栈;
    
  •  否则,不断弹出栈顶元素,并计算以弹出元素为高度的矩形的面积,更新最大面积值。
    
  • 3、在遍历完成后,如果栈中仍有柱子,则按照右边界为数组长度计算矩形面积。

关键是理解思路,为什么需要这么做,参考下面图解理解
查看leetcode图解方法二:以空间换时间,可以使用的数据结构是栈

Java实现

public class LargestRectangleInHistogram {public int largestRectangleArea(int[] heights) {int n = heights.length;Stack<Integer> stack = new Stack<>();int maxArea = 0;for (int i = 0; i <= n; i++) {//如果当前柱子的高度小于栈顶柱子的高度,说明找到了一个可能构成矩形的位置//stack不为空且i == n,证明剩下的栈里面都是递增的数据while (!stack.isEmpty() && (i == n || heights[i] < heights[stack.peek()])) {//前一个柱子高度int height = heights[stack.pop()];//栈为空就是没有数据高度比当前数据低,宽度就是数组坐标int width = stack.isEmpty() ? i : i - stack.peek() - 1;maxArea = Math.max(maxArea, height * width);}stack.push(i);}return maxArea;}public static void main(String[] args) {LargestRectangleInHistogram solution = new LargestRectangleInHistogram();int[] heights = {2, 1, 5, 6, 2, 3};int maxArea = solution.largestRectangleArea(heights);System.out.println("Max area: " + maxArea);  // Output: 10}
}

时间空间复杂度

  • 时间复杂度:O(n),其中n为柱状图的高度数组heights的长度。因为需要遍历柱状图的高度数组一次。

  • 空间复杂度:O(n),使用了一个额外的栈来存储柱子的索引。

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

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

相关文章

[阅读笔记1][GPT-3]Language Models are Few-Shot Learners

首先讲一下GPT3这篇论文&#xff0c;文章标题是语言模型是小样本学习者&#xff0c;openai于2020年发表的。 这篇是在GPT2的基础上写的&#xff0c;由于GPT2还存在一些局限&#xff0c;这篇对之前的GPT2进行了一些完善。GPT2提出了多任务学习&#xff0c;也就是可以零样本地用在…

第九、十章 异常、模块、包以及数据可视化

第九章 异常、模块、包 异常 捕获异常 捕获常规异常 # 捕获常规异常 try:f open("D:/abc.txt", "r", encoding "UTF-8") except:print("出现异常了&#xff0c;因为文件不存在&#xff0c;我将open的模式&#xff0c;改为w模式去打开&qu…

SpringBoot 配置 jedis 来连接redis

Maven依赖 首先配置 maven依赖&#xff0c;这个依赖&#xff0c;要结合自己的springboot 的版本去选&#xff0c; 如果想要看自己的springboot 版本 在 启动类中去 加入&#xff0c;这两行代码 String version SpringBootVersion.getVersion(); log.info("***SpringBo…

大唐杯题目

5G NR 系统中&#xff0c;UE 收到 RRCSetup后&#xff0c;可能会有以下哪些过程 A.进入 RRC CONNECTED&#xff0c;停止小区重选: B.如果 NAS 层提供了多个S-NSSAI&#xff0c;则写入 s-nssai-List; C.发送 RRCSetupComplete. D.UE 启动 T300&#xff0c;将 RRCSetupReguest 消…

数据结构 -- 二叉树

简介 : 二叉树有左右两个子节点 ; 我们可以用一个包含左孩子和右孩子的结构体数组来存储二叉树 : const int N 1e6 10 ;// 存储 : struct Node{int l , r ; }a[N]; 读入 : for(int i1;i<n;i) cin >> a[i].l >> a[i].r ; 用链表实现参考 : 二叉树…

from表单的作用、组成和用法

from表单的作用表单在网页中主要负责数据采集功能&#xff0c;它用<form>标签定义。用户输入的信息都要包含在form标签中&#xff0c;点击提交后&#xff0c;<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里&#xff0c;经过服务器上的 ASP 或…

中国联通,互联互通:构建全国乃至全球云服务网络

广泛覆盖&#xff0c;互联互通&#xff1a;构建全国乃至全球云服务网络 中国联通云联网凭借其广泛的覆盖范围和强大的互联互通能力&#xff0c;为企业提供了前所未有的云资源接入便利。在国内&#xff0c;云联网已覆盖至中国境内的334个城市&#xff0c;几乎触及每一处有业务需…

LeetCode:203.移除链表元素

&#x1f3dd;1.问题描述&#xff1a; &#x1f3dd;2.实现代码&#xff1a; typedef struct ListNode ListNode; struct ListNode* removeElements(struct ListNode* head, int val) {if(headNULL)return head;ListNode *NewHead,*NewTail;ListNode *pcurhead;NewHeadNewTail…

【C++】C++11右值引用

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.什么是左值&&…

HCIP——HCIA回顾(笔记)

OSI OSI -- 开放式系统互联参考模型&#xff08;7层参考模型&#xff09; 应用层 抽象语言 -》编码 表示层 编码-》二进制 会话层 提供应用程序的会话地址 传输层 分段 数据包容量不易过大&#xff0c;否则影响传输效率及共享宽带&#xff1b;分段大小由MTU决定&…

python前端tkinter

基础窗口展示&#xff1a; import tkinter as tknewWin tk.Tk() newWin.title("Im a new window!") newWin.geometry("400x300500300") #设置窗口的大小以及初始位置lab tk.Label(newWin) #lab tk.Label() lab.config(text "Im a new label!&q…

积极探索新质生产力,九河云携手华为云技术交流引领数智跃迁

4月18日&#xff0c;九河云携手华为云举办了华为云SA技术培训会议&#xff0c;培训邀请到华为云技术人员作为主讲人&#xff0c;通过理论讲解与案例结合的方式&#xff0c;围绕ECS和EBS之间的联动&#xff0c;调优和数据保护等方面展开&#xff0c;深入浅出地讲解了基于EBS部署…

常用UI组件

一、文本组件 1.1 概述 Text为文本组件&#xff0c;用于显示文字内容 1.2 参数 Text组件的参数类型为string | Resource Entry Component struct Index {build() {Column({space : 50}) {Text(你好).fontSize(50)}.width(100%).height(100%).justifyContent(FlexAlign.Cent…

便携式HD-SDI模拟源测试设备

便携式HD-SDI模拟源测试设备 平台简介 便携式手提CameraLink模拟源测试设备&#xff0c;以PCIe的HD-SDI播出卡和X86主板为基础&#xff0c;构建便携式的手提设备。 平台默认操作系统为win7 64位系统&#xff1b;具备丰富的外设接口&#xff0c;如VGA、HDMI、千兆网口、USB2.0/3…

HCIP——MPLS(笔记)

MPLS--多协议标签交换技术 包交换 数据组成数据包&#xff0c;之后&#xff0c;在各个网络节点中不断传递&#xff0c;最终到达目标。包交换转发效率不高的问题所在&#xff1a;1&#xff0c;在整个包交换的过程中&#xff0c;需要先查询路由表之后再查看ARP缓存表两张表来完…

Java刷题API

因为经常用Java刷题&#xff0c;记录一下常用到的API 数组 1. 定义&#xff08;两种方法&#xff09; type arrayName[]; //第一种 type[] arrayName; //第二种//eg int arrayName[] new int[5]; int[] arrayName new int[5];//二维数组 int arrayName[][] new int[5][5]…

【 基于Netty实现聊天室聊天业务学习】第4节.什么是BIO与NIO

IO在读写的时候是阻塞的&#xff0c;无法做其他操作&#xff0c;并发处理能力的非常低&#xff0c;线程之间访问资源通信时候也是非常耗时久&#xff0c;依赖我们的网速&#xff0c;带宽。 我们看一下他的白话原理 我们来看一下这张图那么这张图的话它里面有一个server还有三个…

【C++题解】1607. 两位数运算

问题&#xff1a;1607. 两位数运算 类型&#xff1a;基本运算、拆位求解 题目描述&#xff1a; 小丽在编程课上学会了拆位运算&#xff0c;她已经可以拆出一个两位整数的十位和个位了&#xff0c;她想知道这个整数的十位 / 个位的结果是多少&#xff0c;请编程帮她实现&#…

【问题处理】银河麒麟操作系统实例分享,adb读写缓慢问题分析

1.问题环境 处理器&#xff1a; HUAWEI Kunpeng 920 5251K 内存&#xff1a; 512 GiB 整机类型/架构&#xff1a; TaiShan 200K (Model 2280K) BIOS版本&#xff1a; Byosoft Corp. 1.81.K 内核版本 4.19.90-23.15.v2101.ky10.aarch64 第三方应用 数据库 2.问题…

深度学习--CNN应用--VGG16网络和ResNet18网络

前言 我们在学习这两个网络时&#xff0c;应先了解CNN网络的相关知识 深度学习--CNN卷积神经网络&#xff08;附图&#xff09;-CSDN博客 这篇博客能够帮我们更好的理解VGG16和RetNet18 1.VGG16 1.1 VGG简介 VGG论文网址&#xff1a;VGG论文 大家有兴趣的可以去研读一下…