84. Largest Rectangle in Histogram

2023-11-15

84. Largest Rectangle in Histogram

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

img
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]
Output: 6
题目大意

给出图形,计算以该图形为容器能接的雨水的最大体积。

思路
动态规划

对于每个小矩形而言,它所能装的雨水体积由其左边最大高度的矩形和右边最大高度的矩形决定,二者之间取最小值再减去自己的高度即为自己装的雨水体积。left_max[i] = max(left_max[i-1], height[i]),right_max[i] = max(right_max[i+1], height[i]),需要注意的是求左边最大值需要从左往右遍历,求右边最大值需要从右往左遍历,因为left_max[0]和right_max[l-1]是首先确定的,求的过程也分别是从左往右和从右往左进行状态转移的。最后将每个矩形能装的雨水求和即可。

单调栈

这种计算方法有点类似于计算最大矩形面积。构造一个单调递减栈,当当前矩形大于栈顶时,则说明栈顶是洼地,栈中下一个元素和当前元素都比栈顶大。我们可以计算以当前栈顶元素为最低点,栈中下一个元素和当前元素为左右边界围成的矩形的面积,其宽度是i -1-s.peek(),其高度为min(height[s.peek()], height[i]) - height[top]。之后再累积求矩形面积总和即可。

动态规划算法是算竖着的矩形面积,单调栈算的是横着的条形面积。

代码
class Solution {
    public int trap(int[] height) {
        int l = height.length;
        if(l == 0) return 0;
        int res = 0;
        
        /**
        //动态规划
        int []left_max = new int[l];
        int []right_max = new int[l];
        left_max[0] = height[0];
        right_max[l-1] = height[l-1];
        for(int i = 1; i < l; i++){
            left_max[i] = Math.max(left_max[i-1], height[i]);
        }
        for(int i = l-2; i >= 0; i--){
            right_max[i] = Math.max(right_max[i+1], height[i]);
        }
        for(int i = 1; i < l-1; i++){
            res += Math.min(left_max[i], right_max[i]) - height[i];
        }
        return res;
        **/
        
        //单调栈
        Stack<Integer>s = new Stack<>();
        for(int i = 0; i < l; i++){
            while(!s.empty() && height[s.peek()] < height[i]){
                int top = s.pop();
                if(s.empty()) break;
                int width = i - 1 - s.peek();
                res += (Math.min(height[s.peek()], height[i]) - height[top])*width;
            }
            s.push(i);
        }
        return res;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

84. Largest Rectangle in Histogram 的相关文章

  • 『力扣刷题本』:逆波兰表达式求值

    大家好久不昂 最近 1 个多月罗根一直在备考期末 文章发的很少 现在已经放寒假啦 学习自然也不能拉下 毕竟 4 月份就要去参加蓝桥杯了 先给自己定个小目标 日更 2 篇 咳咳 下面马上开始讲题 一 题目 给你一个字符串数组 tokens 表
  • 扬帆证券:A股高股息资产“画像”:连续数年跑赢大盘

    近期A股分红 大方 股息率较高的板块再次引起关注 走势显着强于同期大盘 并继续遭到商场追捧 有专家在接受证券时报记者采访时以为 近年A股商场高股息财物受捧背面 有多种要素在发挥作用 包含高股息财物本身具有的出资优势 微观经济布景 出资者心态
  • 运行时检查失败 #2 - 变量“x”周围的堆栈已损坏

    在以下代码中返回时 我收到此运行时检查失败 我相信类似的代码在程序的其他地方运行良好 有任何想法吗 String GetVariableName CString symbol CString filepath char acLine 512
  • 如何用一个数组实现3个栈?

    有时 我会遇到以下面试问题 如何用一个数组实现3个堆栈 当然 任何静态分配都不是解决方案 空间 而非时间 高效 你可以 1 定义两个堆栈 从数组端点开始并沿相反方向增长 2 将第三个堆栈定义为从中间开始并向您想要的任何方向增长 3 重新定义
  • 在 c 中使用 malloc 实现堆栈 [初学者]

    出于学习目的 我正在用 c 语言实现一个堆栈及其函数 我添加了一些小的附加功能来第一次使用 malloc 并尝试正确理解它 我编写了一个最初创建堆栈结构的函数 该函数的返回值是一个具有已分配内存的新结构 在返回值应该是结构的函数中处理 ma
  • 使用堆栈反转数组

    我正在尝试使用堆栈反转数组 但是 我收到错误arr i stack top 在 Eclipse 中解决它的建议是将其更改为arr i stack pop 或添加演员阵容 还有其他方法吗 或者我犯了一个错误 我看到教程和问题询问如何使用堆栈反
  • Android:清除后退堆栈

    在 Android 中 我有一些活动 比如说 A B C 在A中 我使用以下代码打开B Intent intent new Intent this B class startActivity intent 在B中 我使用以下代码打开C In
  • 缓冲区溢出攻击(攻击实验室第 2 阶段)

    我有一个缓冲区溢出实验室 我必须为一个名为攻击实验室 http csapp cs cmu edu 3e attacklab pdf 我处于实验室的第二阶段 我必须将代码作为漏洞利用字符串的一部分注入 以使程序指向函数 touch2 的地址
  • C语言函数指针内存解释

    include
  • 在堆栈上增长数组

    这本质上是我的问题 在函数的生命周期中 我生成一些整数 然后在也是同一函数一部分的算法中使用整数数组 整数数组仅在函数内使用 因此将数组存储在堆栈上自然是有意义的 问题是在生成所有整数之前我不知道数组的大小 我知道如何在堆栈上分配固定大小和
  • 什么会导致 Valgrind 堆栈跟踪中出现奇怪的地址?

    这个问题与从 valgrind 输出中过滤掉垃圾 https stackoverflow com questions 34325305 filtering out junk from valgrind output 我正在尝试调试一个大型项
  • geom_text 仅位于堆积条形图的顶部

    我想仅在堆叠条形图的顶部添加标签 这是我的数据框 create data frame building lt c Burj nKhalifa Zifeng nTower Bank of nAmerica Tower Burj Al Arab
  • 从 Android 应用程序堆栈中手动删除活动

    我一直在开发 Android Native App 我想做的是 Activities A gt B gt C Then A gt B gt C gt C 从 C Activity 中 如果它再次指向 C 那么我想手动从堆栈中删除 C B 在
  • 如何增加 Qt 中线程的堆栈大小 - QThread::setStackSize() 似乎不起作用?

    从问题来看 运行批量插入或替换 500 行时 SQLite 堆栈溢出 为什么 https stackoverflow com questions 22576958 sqlite stack overflow when running a b
  • 不要在异常堆栈中显示 Python raise-line

    当我在 Python 库中引发自己的异常时 异常堆栈将引发行本身显示为堆栈的最后一项 这显然不是一个错误 在概念上是正确的 但是当您在外部使用代码 例如作为模块 时 它会将重点放在对调试无用的东西上 有没有办法避免这种情况并强制 Pytho
  • 为什么Python有最大递归深度?

    Python有最大递归深度 但没有最大迭代深度 为什么递归受到限制 把递归当成迭代来对待 而不限制递归调用的次数不是更自然吗 我只想说这个问题的根源来自于尝试实现流 参见这个问题 https stackoverflow com questi
  • 在 iOS4 中视图控制器即将弹出时收到通知

    这个问题以前有人问过 但我能找到的答案是 2009 年的 不适合我的问题 让我重申一下这个问题 我有一个UINavigationController产生并推动许多不同的UIViewControllers 入栈 其中之一涉及一些核心数据操作
  • 将 DIV 堆叠在一起?

    是否可以堆叠多个 DIV 例如 div div div div div div div div div div 那么所有这些内部 DIV 都具有相同的 X 和 Y 位置吗 默认情况下 它们都在彼此下方 将 Y 位置增加了上一个 DIV 的高
  • 检测堆栈已满

    在编写 C 代码时 我了解到使用堆栈来存储内存是一个好主意 但最近我遇到了一个问题 我有一个实验 其代码如下所示 void fun const unsigned int N float data 1 N N float data 2 N N
  • Push 和 Pop 对堆栈意味着什么?

    长话短说 我的讲师很糟糕 他通过投影仪向我们展示前缀堆栈的中缀 他的大影子挡住了一切 所以我错过了重要的东西 他指的是push和pop push 0 pop x 他举了一个例子 但我根本看不出他是如何得到答案的 2 3 2 1 5 4 1

随机推荐

  • 设计模式-桥接模式

    文章目录 前言 桥接模式的核心概念 为什么要使用桥接模式 桥接模式的示例代码 使用场景 桥接模式优缺点 前言 当我们谈到设计模式时 桥接模式 Bridge Pattern 是一种结构型设计模式 用于将抽象部分与其实现部分分离开来 以便它们可
  • 数据驱动的数字化转型:从流程驱动到数据驱动

    数字化时代已经到来 1996年的时候 Being Digital 的作者Negroponte就提出数字化生活的概念 而20年以后的今天 我们已经进入了数字化的生活 移动互联网 物联网 手机 各种社交媒体 电子支付等各种数字化技术把我们的生活
  • top查询机器情况

    top命令 是Linux下常用的性能 分析工具 能够实时显示系统 中各个进程的资源占用状况 类似于Windows的任务管理 器 下面详细介绍它的使用方法 top 02 53 32 up 16 days 6 34 17 users load
  • 虚拟机Ubuntu与主机复制文字

    执行以下几条命令即可 sudo apt get install open vm tools sudo apt get install open vm tools desktop 重启
  • 【翻译】白人男性在改善性别多样性方面的作用是什么?

    我们都知道 或者说现在应该知道 多元化的团队和组织更成功 更有创造力 有更好的留任率 并能带来更健康的工作场所文化 强调这些观点的数据是很多的 然而 技术团队在这方面往往是落后的 艾米丽 张在她的书 Brotopia 中认为 在一个如此有力
  • vhdl语言入门_初学Chisel语言,看这篇就够了:最方便简洁的入门资料整理

    声明 本文是我一个很优秀的学生总结的 放出来供广大chisel语言爱好者参考 Chisel Constructing Hardware In a Scala Embedded Language 是UC Berkeley开发的一种开源硬件构造
  • Python代码实现图像语义分割

    Python代码实现图像语义分割的步骤详解 原文链接 https www jb51 net article 187249 htm 在网上看到了这篇 代码简洁 身为还没完全入门的小白 每跑通一个程序真的都好开心 1 环境部署 在进行项目设计前
  • Gitee教程(超详细、简单)

    目录 前提 Gitee上传代码到远程仓库 1 打开Git Bash Here 2 配置用户和邮箱 3 初始化仓库 4 添加项目文件至本地仓库 5 将待提交区域的修改提交到本地 Git 仓库 并添加提交注释 必不可少 6 将本地仓库与远程仓库
  • blob字段怎么查看是乱码_MySQL乱码的原因和设置UTF8数据格式

    MySQL使用时 有一件很痛苦的事情肯定是结果乱码 将编码格式都设置为UTF8可以解决这个问题 我们今天来说下为什么要这么设置 以及怎么设置 MySQL字符格式 字符集 在编程语言中 我们为了防止中文乱码 会使用unicode对中文字符做处
  • 因果模型四:实现因果模型的python工具——pycasual

    因果模型四 实现因果模型的python工具 pycasual 关于因果模型 我们在前三篇文章中简单介绍了因果模型的研究发展历程 一个因果模型的数学化求解过程和因果模型在医学和商业领域的两个应用实例 今天我们就来简单介绍一个实现因果模型的py
  • 对UDP编程的初步认识

    UDP与TCP的区别 1 1 TCP协议 传输控制协议 使用TCP协议前 须先建立TCP连接 形成传输数据通道 传输前 采用 三次握手 方式 TCP协议进行通信的两个应用进程 客户端 服务端 在连接中进行大数据量的传输 传输完毕 需释放已建
  • 淘宝开放平台 ISV入驻开发流程

    原本的千牛插件整合到淘宝开放平台中 原本的千牛入驻教程时间为17年的 已经不适用了 最新的新手入驻指南是的是2020年6月的 按照流程登录账号 确定需要创建应用的类目 有的类目比如订单管理都是定向开发者无法申请的 我申请的是服务类目的 根据
  • 【objectARX学习计划】

    按照 ObjectARX开发实例教程 pdf 学习计划 序号 模块 开发功能 是否重点 难度 学时 天 时间计划 完成情况 备注 1 创建和编辑基本图形对象 创建直线 是 容易 1 2 创建圆 是 容易 3 创建圆弧 是 容易 4 创建多段
  • 网页伸缩式导航栏(附源码)

    网页伸缩式导航栏 效果图如下 文件目录 html代码 index html
  • Kubernetes之(十九)资源指标和集群监控

    目录 Kubernetes之 十九 资源指标和集群监控 资源指标和资源监控 metrics server 部署metrics server Prometheus 概述 部署prometheus Grafana数据展示 Kubernetes之
  • .net Core竟然支持xamrain

    终于明白 net Core的意义 以前在微软推出 net Core时 我有点不明白 为啥微软要弄个阉割版的net平台 现在 刚接触 xamarin跨平台开发 发现 net Core竟然轻松支持xamrain开发安卓程序 微软微软 真是用心良
  • Linux系统常用命令

    Linux系统常用命令 一 常用快捷键 ctrl shift table 表示临时变大 ctrl table 表示临时变小 ctrl t 打开多个 一个 终端 永久生效 终端上的 edit 属性设置 ctrl l clear 清屏 ctrl
  • 2021蓝桥杯模拟赛-受伤的皇后

    题目 题目链接 题解 DFS 八皇后问题改编而已 加入判断左上三格内和右上三格内是否存在皇后 代码 include
  • MYSQL对表进行操作

    添加列 基本形式 alter table 表名 add 列名 列数据类型 after 插入位置 示例 在表的最后追加列 address alter table students add address char 60 在名为 age 的列后
  • 84. Largest Rectangle in Histogram

    84 Largest Rectangle in Histogram Given n non negative integers representing an elevation map where the width of each ba