84.柱状图中最大的矩形

news2024/11/24 11:08:02

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        //法一:枚举宽,超时
        if(0){
            int n=heights.size();

            int area=0;
            for(int left=0;left<n;++left){
                int minH=INT_MAX;
                for(int right=left;right<n;++right){
                    minH=min(minH,heights[right]);
                    area=max(area,(right-left+1)*minH);
                }
            }
            return area;
        }else if(0){
        //法二:枚举高,超时
        //固定矩形的高度h,随后从这个柱子开始向两侧延伸,只到遇到高度小于h的柱子,就确定矩形的左右边界
            int n=heights.size();
            int area=0;

            for(int mid=0;mid<n;++mid){
                int h=heights[mid];
                int left=mid,right=mid;
                while(left-1>=0&&heights[left-1]>=h){
                    --left;
                }
                while(right+1<n&&heights[right+1]>=h){
                    ++right;
                }
                area=max(area,(right-left+1)*h);
            }
            return area;
        }else if(0){
            //法三:单调栈,是对枚举高的优化
            //求每一根柱子左侧且最近的小于其高度的柱子及右侧且最近的小于其高度的柱子,左右边界
            //若0位置大于1位置,则0可不能是2位置的左侧且最近的小于其高度的柱子,明显1位置更符合
            //单调栈栈中大于i位置的元素可以出栈
            int n=heights.size();
            vector<int> left(n),right(n);
            stack<int> ls,rs;

            for(int i=0;i<n;i++){
                while(!ls.empty()&&heights[ls.top()]>=heights[i]){
                    ls.pop();
                }
                left[i]=ls.empty()?-1:ls.top();
                ls.push(i);
            }

            for(int i=n-1;i>=0;--i){
                while(!rs.empty()&&heights[rs.top()]>=heights[i]){
                    rs.pop();
                }
                right[i]=rs.empty()?n:rs.top();
                rs.push(i);
            }

            int ans=0;
            for(int i=0;i<n;++i){
                ans=max(ans,(right[i]-left[i]-1)*heights[i]);
            }
            return ans;
        }else if(1){
            //法四:单调栈+常数优化
            int n=heights.size();
            //left记录i位置左侧最近的小于其高度的柱子下标
            //right记录i位置右侧最近的小于其高度的柱子的下标
            //单调栈中记录小于i位置柱子高度的位置下标,若高度大于等于则出栈,栈顶位置为左侧最近的小于i位置的柱子下标
            //左、右边界中的柱子均满足大于i位置的柱子高度,计算面积时以i位置柱子高度计算
            vector<int> left(n),right(n,n);
            stack<int> mono_stack;
            for(int i=0;i<n;i++){
                while(!mono_stack.empty()&&heights[mono_stack.top()]>=heights[i]){
                    right[mono_stack.top()]=i;
                    mono_stack.pop();
                }
                left[i]=mono_stack.empty()?-1:mono_stack.top();
                mono_stack.push(i);
            }
            int ans=0;
            for(int i=0;i<n;++i){
                ans=max(ans,(right[i]-left[i]-1)*heights[i]);
            }
            return ans;
        }
    }
}; 

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

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

相关文章

Spring实例化源码解析之MessageSource(七)

前言 在阅读完 registerBeanPostProcessors 源码之后&#xff0c; 下一步就进入到 initMessageSource&#xff0c;这一步主要作用是初始化国际化文件。 源码分析 这段源码是一个Java方法&#xff0c;用于初始化消息源&#xff08;MessageSource&#xff09;。在Spring框架中…

万字详解HTTP协议面试必备技能

目录 一、HTTP 是什么 二、理解 "应用层协议" 2.1理解 HTTP 协议的工作过程 2.2HTTP 协议格式 2.3抓包工具的使用 2.4抓包工具的原理 2.5抓包结果 2.5.1HTTP请求 2.5.2HTTP响应 2.6协议格式总结 三、HTTP 请求 (Request) 3.1认识 URL 3.1.1URL 基本格式 …

Jmeter 多实例压测

Apache JMeter 是一个开源的 Java 应用程序&#xff0c;用于性能测试和负载测试。它最初是为测试 Web 应用程序而创建的&#xff0c;但现在已广泛用于测试各种不同类型的应用程序&#xff0c;包括数据库、消息队列、FTP 服务器等。JMeter 提供了丰富的功能&#xff0c;使您能够…

行内元素文字背景被截断的问题,如何进行修改?

1.问题如图所示 这里背景是被截断的&#xff0c;有什么css样式可以修改它呢&#xff1f; 效果实现如图&#xff1a; 不一样的地方在于这里的截断位置是引用了开头和结尾的位置。 如何实现&#xff1f; <!DOCTYPE html> <html lang"en"> <head><…

终于找到了!Jenkins最全最详细入门指南

目录 一、介绍 二、功能 三、搭建Jenkins目的 四、安装 五、Jenkins的三大概念 六、创建job & 配置git 七、构建触发器&#xff08;build triggers&#xff09; 八、运行python脚本 九、测试报告展示 十、配置邮件并发送 最后 一、介绍 Jenkins是开源的,使用Java编…

Linux系统部署PostgreSQL 单机数据库

安装方式 1 安装包方式 &#xff08;Packages and Installers&#xff09; 支持的操作系统包括 liunxMacosWindowsBSDSolaris 2 源码安装 &#xff08;Source code&#xff09; 下载源码包 通过下载地址PostgreSQL: File Browser 可以看到有各个版本的源码目录 选择13.1…

二维离散傅里叶变换的实现

二维离散傅里叶变换的实现 1.使用Python包实现2.使用c实现2.1 FFTW库安装2.2 结果比较 参考文献 1.使用Python包实现 import numpy as np import matplotlib.pyplot as plt anp.array([0, 2, 4, 1,6, 1, 3, 2,5]).reshape(3,3) fnp.fft.fft2(a) fshiftnp.fft.fftshift(f) mag…

CSS圆角大杀器,使用滤镜构建圆角及波浪效果

目录 1&#xff0c;border-radius实现圆角2&#xff0c;filter: contrast() 配合 filter: blur() 实现圆角3&#xff0c;使用 filter: contrast() 配合 filter: blur() 实现波浪效果 1&#xff0c;border-radius实现圆角 通常我们加个 border-radius就可实现一个div盒子的圆角…

分页查询(关键词: limit)

MySQL从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129334507?spm1001.2014.3001.5502 比如现在有一张表emp有15条数据 我想每页只显示5条数据,分3页,这样看起来简捷一些,我该怎么实现呢 语法格式: select */列名 from 表名 limit 初…

CMAKE使用记录

CMAKE使用记录 CMake简化了针对同一项目的不同平台、不同编译器的构建过程和编译过程&#xff0c;能够管理各种规模的项目。 CMAKE命令记录 cmake命令说明 语法&#xff1a; # cmake构建项目的编译系统 Generate a Project Buildsystem > cmake [<options>] -B &…

85.最大矩形

单调栈&#xff0c;时间复杂度o(mn)&#xff0c;空间复杂度o(mn) class Solution { public:int maximalRectangle(vector<vector<char>>& matrix) {int mmatrix.size();if(m0){return 0;}int nmatrix[0].size();//记录矩阵中每个元素左边连续1的数量vector<…

如何开发一款高效便捷的搬家服务小程序

随着互联网的发展&#xff0c;小程序已成为各行各业重要的业务推广和用户服务平台。对于搬家行业而言&#xff0c;开发一款高效便捷的搬家服务小程序具有巨大的市场潜力。本文将为您详细介绍如何开发一款这样的搬家服务小程序。 一、进入乔拓云网后台 在开始制作搬家服务小程序…

番外项目---Vim编辑器

Task01: 1.在/tmp目录下建立一个名为mytest的目录&#xff0c;进入mytest目录当中; 2.将/etc/man_db.conf复制到上述目录下面&#xff0c;使用vim打开目录下的man_db.conf文件; 3.在vim中设定行号&#xff0c;移动到第58行&#xff0c;向右移动15个字符&#xff0c;请问你看到…

文件丢失怎么找回?收藏好这3个方法!

“我真的要哭了&#xff0c;不小心把一些很重要的文件弄丢了&#xff0c;现在不知道该怎么办了&#xff0c;有没有什么方法可以把这些文件找回来呀&#xff1f;大家快帮帮我吧&#xff01;” 在日常办公中&#xff0c;很多用户都会习惯性的把一些重要的文件和数据保存在电脑上。…

UE4游戏客户端开发进阶学习指南

前言 两年多前写过一篇入门指南&#xff0c;教大家在短时间内快速入门UE4的使用&#xff0c;在知乎被很多人收藏了。如今鸡佬使用UE快三年了&#xff0c;是时候更新一下进阶版本的学习指南。本文对于读者的要求&#xff1a; 有一定的C基础已经入门UE&#xff0c;能够用蓝图和…

AD 域控使用回收站批量还原用户

一、Read me. 测试版本winserver 2019&#xff0c;其余版本请查阅文档或者实际操作尝试。 前提需要预先开启回收站功能&#xff01;&#xff01;&#xff01;&#xff01; 没有开启可以点&#xff0c;开启后则变灰色。 如果是人为操作并且没有开启这个功能&#xff0c;那么不…

【算法训练-数组 四】【数组合并】:合并两个有序数组

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【数组组合】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

【小黑送书—第三期】>>《深入浅出SSD》

近年来国家大力支持半导体行业&#xff0c;鼓励自主创新&#xff0c;中国SSD技术和产业良性发展&#xff0c;产业链在不断完善&#xff0c;与国际厂商的差距逐渐缩小。但从行业发展趋势来看&#xff0c;SSD相关技术仍有大幅进步的空间&#xff0c;SSD相关技术也确实在不断前进。…

localhost和127.0.0.1都可以访问项目,但是本地的外网IP不能访问

使用localhost和127.0.0.1都可以访问接口&#xff0c;比如&#xff1a; http://localhost:8080/zhgl/login/login-fy-list或者 http://127.0.0.1:8080/zhgl/login/login-fy-list返回json {"_code":10000,"_msg":"Success","_data":…

数据结构与算法-循环链表、双向链表

我们这里接着上一篇单链表继续往下深入学习循环链表、双向链表。 链表 &#x1f388;3.循环链表&#x1f52d;3.1循环链表的概念&#x1f52d;3.2循环链表的基本操作&#x1f50e;3.2.1创建空表&#x1f50e;3.2.2插入操作&#x1f50e;3.2.3删除操作 &#x1f388;4.双向链表&…