AcWing-直方图中最大的矩形

131. 直方图中最大的矩形 - AcWing题库

所需知识:单调栈

思路:要求最大矩形,所以需要使矩形的高与长的乘积最大即可,依次从左到右将每一列当作中心列,向两边扩散,直到两边的高都小于该列的高,即为以该列为中心的最大矩形面积(中心不一定在整块矩形的正中间)

例:

该图中从3到5这块矩形的中心可以为3或者4或者5;

依次遍历每一列即可得出所有直方图中的最大矩形。

若在遍历列的时候再去判断它前面或后面的列的高度是否小于它,则需要o(n2),显然数据范围过大,只能过一部分数据,我们考虑将每列的前方与后方的第一个小于它高度的列预处理出来(利用单调栈);

单调栈:整个栈内的数据严格单调,该题为单调递减栈(即入栈元素必须小于栈顶元素,不然就将栈顶元素pop掉,然后继续判断,直到栈内没有比他大的元素了,此时栈顶则为该区间最小值);

可以利用c++的stack,或者自己用数组模拟一个栈(据说自己用数组模拟跑出来更快)

C++代码:(利用stack)

#include<iostream>
#include<stack>
#include <vector>
#include<algorithm>
const int N=1e5+10;
typedef long long ll;
using namespace std;
int n;
ll h[N],l[N],r[N];
int main(){while(cin>>n,n){for(int i=1;i<=n;i++){cin>>h[i];}stack<int>st;h[0]=h[n+1]=-1;//将数组边界变成-1,不可能有高度比-1小,就可以不用特判边界了st.push(0);for(int i=1;i<=n;i++){while(h[st.top()]>=h[i])st.pop();//维护栈的单调性l[i]=st.top();//此时栈顶元素即为第一个小于h[i]的下标st.push(i);//将每个元素都入一次栈}//将左边的算出来后清空栈,计算右边的while(!st.empty()){st.pop();}//与左边同理,模拟一遍st.push(n+1);for(int i=n;i>0;i--){while(h[st.top()]>=h[i])st.pop();r[i]=st.top();st.push(i);}ll res=0;for(int i=1;i<=n;i++){res=max(res,(r[i]-l[i]-1)*h[i]);}cout<<res<<endl;}return 0;
}

C++代码:(用数组模拟stack)

//基本思路与上面一样,只不过栈变成数组了
#include<iostream>
#include <vector>
#include<algorithm>
const int N=1e5+10;
typedef long long ll;
using namespace std;int n;
ll h[N],l[N],r[N];
int st[N];
int main(){while(cin>>n,n){for(int i=1;i<=n;i++){cin>>h[i];}h[0]=h[n+1]=-1;int tt=0;st[++tt]=0;for(int i=1;i<=n;i++){while(h[st[tt]]>=h[i]) tt--;//tt--模拟数组中popl[i]=st[tt];st[++tt]=i;//将i加入栈中}tt=0;st[++tt]=n+1;for(int i=n;i>0;i--){while(h[st[tt]]>=h[i]) tt--;r[i]=st[tt];st[++tt]=i;}ll res=0;for(int i=1;i<=n;i++){res=max(res,(r[i]-l[i]-1)*h[i]);}cout<<res<<endl;}return 0;
}

tips:最后注意开long long;还有h[st[tt]]>=h[i] 中的 '=' 因为要求比h [i] 小的元素,所以相等也满足;将h[0]=h[n+1]=-1;可以不用特判边界

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

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

相关文章

Vmware虚拟机Centos7固定IP地址

1、点击编辑-虚拟网络编辑器 2、点击更改设置、修改虚拟网络配置器并确认保存&#xff08;见图&#xff09; 这个子网IP和子网掩码的前三位需要一样网关的前三位需要和子网ip一致。 3、打开设置“网络和Internet”&#xff0c;点击“更改适配器选项”&#xff0c;点击适配器VM…

PP-LCNet:一种轻量级CPU卷积神经网络

PP-LCNet: A Lightweight CPU Convolutional Neural Network 最近看了一个新的分享&#xff0c;在图像分类的任务上表现良好&#xff0c;具有很高的实践意义。 论文&#xff1a; https://arxiv.org/pdf/2109.15099.pdf项目&#xff1a; https://github.com/PaddlePaddle/Padd…

JUC并发编程2(高并发,AQS)

JUC AQS核心 当有线程想获取锁时&#xff0c;其中一个线程使用CAS的将state变为1&#xff0c;将加锁线程设为自己。当其他线程来竞争锁时会&#xff0c;判断state是不是0&#xff0c;不是自己就把自己放入阻塞队列种&#xff08;这个阻塞队列是用双向链表实现&#xff09;&am…

探索ChatGPT-Plus:AI 助手全套开源解决方案

探索ChatGPT-Plus&#xff1a;AI 助手全套开源解决方案 ChatGPT-plus是一种新型的对话生成模型&#xff0c;它是在OpenAI的ChatGPT基础上进行了改进和优化的版本。ChatGPT-plus的出现引起了广泛关注&#xff0c;因为它在对话生成方面展现出了更加出色的表现和能力。在本文中&am…

蒙特卡洛方法【强化学习】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…

flutter嵌入原生view

一、iOS端(Swift实现) 1. 新建原生view(NativeView.swift) &#x1f3f7;️ 需要继承FlutterPlatformView &#xff0c;实现view()方法 import Foundation import Flutterclass NativeView: NSObject, FlutterPlatformView {private var _view: UIViewinit(frame: CGRect,view…

从文件夹(包含子文件夹)找到的包含特定关键词的 Word 文档复制到一个新的文件夹中

import os import glob import shutildef find_and_copy_docs(root_dir, keyword, target_dir):"""在指定的目录及其子目录下查找包含特定关键词的 Word 文档&#xff0c;并将它们复制到目标文件夹。参数:root_dir: 要搜索的根目录路径。keyword: 需要匹配的关键…

make/makefile学习

文章目录 1、makefile函数1.1、字符串替换函数&#xff1a;subst1.2、模式字符串替换函数&#xff1a;patsubst1.3、去空格函数&#xff1a;strip1.4、查找字符串函数&#xff1a;findstring 2、、:、&#xff1f;区别 1、makefile函数 1.1、字符串替换函数&#xff1a;subst …

TS中,PropType导入报错is a type and must be imported using a type-only import...

报错信息&#xff1a; PropType is a type and must be imported using a type-only import when verbatimModuleSyntax is enabled.ts(1484) (alias) type PropType<T> PropConstructor<T> | PropConstructor<T>[] import PropType问题分析&#xff1a; …

《QT实用小工具·二十》存款/贷款计算器

1、概述 源码放在文章末尾 该项目实现了用于存款和贷款的计算器的功能&#xff0c;如下图所示&#xff1a; 项目部分代码如下&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJ…

构造函数,原型对象,对象实例 以及原型链的关系

当我们使用构造函数new的方式创建实例对象&#xff0c;此时构造函数的.prototype属性就是实例对象的原型对象&#xff0c;实例对象可以通过.__proto__来访问到原型对象&#xff0c;同时实例对象会继承原型对象的属性方法。 构造函数和原型对象的关系其实是被包含的关系&#x…

【电子通识】普通电阻、敏感电阻、可调电阻的种类和特点

电阻的作用 在【分立元件】理解电阻 中我们知道电阻是在电路中对电流产生阻碍作用的元件。电阻是电子产品中最基本、最常用的电子元件之一。 有各产品的电路板中基本都有电阻器&#xff0c;通常起限流、滤波或分压等作用。实际上&#xff0c;电阻器的种类很多&#xff0c;根据其…

中服云数字孪生平台 3.0 版全新升级!不仅更好看,而且更好用!

近日&#xff0c;中服云数字孪生平台迎来版本升级。中服云数字孪生平台 3.0 版&#xff0c;以物联网平台 数据中台为基础&#xff0c;以 2D/3D 为展示形式&#xff0c;旨在打造一个从设备数据到孪生应用的一站式数智化平台。 中服云数字孪生平台架构 新版升级 功能急速迭代 …

vue-router(进阶版)

前言 相信大家也是从我的路由初级篇那边过来的,没看的话也可以先从初级开始看,可以提高后续的理解能力 路由初级篇的链接 别的也就不多说了,直接开始 路由的主体构成 前言 之前的路由写法虽然可以使用但是会导致main.js过于臃肿,所以后续基本不会再这么使用了, 初始化路由 创…

4.Hexo 页面属性和模板设置

Frontmatter frontmatter基本上是可以定义的有关不同文件的信息&#xff0c;本质上是元数据 frontmatter是我们可以分配给每个内容页面的信息 在Hexo中创建文件时&#xff0c;Hexo主题可以使用该信息以不同的方式显示该内容 当在Hexo创建了一个文件&#xff0c;在source文件夹…

【JavaWeb】Tomcat服务器

目录 动态网站动态网站的特点 程序架构B/S与C/S的比较B/S技术的工作原理URL 什么是Web服务器 Web服务器、服务端、服务器的区别和联系什么是TomcatTomcat服务器的安装与配置解压缩版本Tomcat的配置添加系统变量&#xff0c;名称为CATALINA_HOME&#xff0c;值为Tomcat的安装目录…

Go-学会string的基本使用

本节重点&#xff1a; 学会 sting 的基本使用 字符串在 Go 中值得特别提及&#xff0c;因为与其他语言相比&#xff0c;string 的实现方式同其他语言略有不同。 什么是字符串&#xff1f; 字符串是 Go 中的字节切片。可以通过将一组字符括在双引号中来创建字符串" "…

OpenTelemetry——What is OpenTelemetry

What is OpenTelemetry? 什么是 OpenTelemetry&#xff1f; A short explanation of what OpenTelemetry is and isn’t. 对 OpenTelemetry 是什么和不是什么的简短说明 OpenTelemetry is an Observability framework and toolkit designed to create and manage telemetry d…

Qt中播放GIF动画

在Qt应用程序中&#xff0c;如果你想在QLabel控件上播放GIF动画&#xff0c;可以使用QMovie类与QLabel配合来实现。以下是详细步骤和代码示例&#xff1a; 步骤1&#xff1a;引入必要的头文件 首先&#xff0c;在你的源代码文件中包含QMovie和QLabel相关的头文件&#xff1a;…

Vue组合式函数,详细解析

什么是“组合式函数”&#xff1f;​ 在 Vue 应用的概念中&#xff0c;“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。 当构建前端应用时&#xff0c;我们常常需要复用公共任务的逻辑。例如为了在不同地方格式化时间&#xff0c;我们…