当前位置: 首页 > news >正文

算法题(181):最大直方矩形面积

审题:

本题需要我们找到以一条任意高度水平线分割的图形中矩形的最大面积,其中该矩形中间不能有空位

思路:

我们先思考一下最终矩形的构成情况,最终矩形的高度一定是等于其中一个竖矩形的最大高度的,因为若低于那个竖矩形则一定会有一个更大矩形,此时结论会矛盾

图解:

所以最终矩形一定是以从某一个竖矩形向两侧延伸得来,故问题变成了如何求出某个高度的矩形的左右边界(比他高度低的最近位置),此时就可以使用单调栈了
方法一:单调栈

第一步:录入数据

第二步:利用单调栈查找左侧和右侧的边界

第三步:根据前面得到的矩形左右边界和矩形高度计算出矩形的面积,并比较出max面积

解题:

#include<iostream>
#include<stack>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll n;
ll v[N];
ll l[N], r[N];
int main()
{while (cin >> n, n){for (int i = 1; i <= n; i++) cin >> v[i];//查找左侧边界stack<int> s;for (int i = 1; i <= n; i++){while (s.size() && v[s.top()] >= v[i]) s.pop();if (s.size()) l[i] = s.top();else l[i] = 0;s.push(i);}//清除单调栈数据残留while (s.size()) s.pop();//查找右侧边界for (int i = n; i >= 1; i--){while (s.size() && v[s.top()] >= v[i]) s.pop();if (s.size()) r[i] = s.top();else r[i] = n+1;s.push(i);}//比对出最终答案ll ret = 0;for (int i = 1; i <= n; i++){ret = max(ret, v[i] * (r[i] - l[i] - 1));}cout << ret << endl;}return 0;
}

SP1805 HISTOGRA - Largest Rectangle in a Histogram - 洛谷

http://www.dtcms.com/a/313456.html

相关文章:

  • datasets库 的map方法num_proc=16并行踩坑
  • Java 中的 final 关键字有哪些用法?
  • C++ 虚函数相关问题 **
  • 基于云模型的模糊综合风险评估Matlab代码
  • 网关与路由器的区别
  • access系统调用及示例
  • 延迟任务方案-DelayQueue
  • SpringBoot 2.x 升 3.x 避坑指南:企业级项目的实战问题与解决方案
  • Celery-分布式任务队列
  • MySQL深度理解-MySQL锁机制
  • 数据结构学习(day01)
  • 第八章:进入Redis的SET的核心
  • Android系统模块编译调试与Ninja使用指南
  • 【数据分享】各省粮食外贸依存度、粮食波动率等粮食相关数据合集(2011-2022)(获取方式看文末)
  • 【MATLAB】(六)多项式的创建与四则运算
  • python的高校奖助学金系统
  • 23 Active Directory攻击与防护策略解析
  • 编译旧版本的electron内核
  • SpringBoot之整合MyBatisPlus
  • Nvidia Orin DK 刷机CUDA TensorRT+硬盘扩容+ROS+Realsense+OpenCV+Ollama+Yolo11 一站式解决方案
  • 从“配置地狱”到“云端乐园”——Nacos 如何成为分布式微服务配置中心的“定海神针”
  • 数组和指针的关系
  • 操作系统——读者写者问题
  • KNX协议介绍
  • Nvidia Orin + RealSense D435i 与3D地图实现导航
  • Ubuntu系统VScode实现opencv(c++)视频的处理与保存
  • [硬件电路-129]:模拟电路 - 继电器的工作原理、关键指标、常用芯片与管脚定义
  • SpringAI的使用
  • Socket编程——TCP协议
  • 从一到无穷大 #51:突破阿姆达尔定律:COZ因果剖析与串行优化八法