原文地址:http://www.geeksforgeeks.org/largest-rectangle-under-histogram/
注意:本文并未对原文完整翻译,而是结合原文并根据本人理解写出,因此部分内容为完整翻译,部分内容为个人理解所写。

Largest Rectangle in Histogram 直方图中最大矩形面积

一个直方图是由许多矩形组成,在给定的直方图中找出最大的矩形面积。为了简化问题,假定所有矩形宽度都为1个单位。

例如,下面的直方图中有7个矩形,高度分别是(6,2,5,4,5,2,6)。最大的矩形面积是12(如下图所示,最大矩形面积用红色方框标出)

下面给出的解决方法时间复杂度为O(n)。矩形面积的计算公式为底*高。对于直方图中的每个矩形’x’(例如图中高度为6,2或5的矩形)以该矩形的高度为高(因为在直方图中最大矩形的高必然是某个单独矩形高),然后计算出最大矩形面积。因此接下来的问题是,若以某个矩形的高度为高,那么最终矩形的左边界和右边界在哪里?确定两个边界后就可以得到宽度,最终计算出面积。

我们从左向右遍历每个矩形,并通过一个栈来存储这些矩形高度在输入数组中的索引。每个矩形(索引)仅压入栈中一次。当输入的矩形高度小于栈顶矩形的高度,那么栈顶矩形将会被弹出,然后计算矩形面积,其中矩形面积的高为弹出单个矩形条的高。现在得到了高,接下来得到左右边界后便可计算出宽度。由于当前输入的矩形i的高度小于栈顶矩形,那么以栈顶为高的矩形右边界为i。而在当前栈中若非空,那么栈中矩形条的高度一定是小于等于弹出的矩形的高度,因此左边界就确定了。(当有多个连续的高度一样的矩形条时,计算最后一个出栈的矩形时会得到最终的面积)

最终算法步骤归纳为:

  1. 创建一个空栈
  2. 从第一个矩形条开始,对每个矩形条的高度height[i] (i的取值范围是[0,n-1])执行下面两步
    a) 如果栈为空,或height[i]大于等于栈顶元素,那么将矩形条i压入栈中。
    b)如果输入的矩形条高度小于栈顶元素高度,那么将栈顶元素在输入数组中的索引tp出栈,然后计算矩形面积。矩形的高为height[tp],而右边界为i,左边界为当前栈顶元素对应的索引,若栈为空,则宽度就是i。
  3. 经过计算后,栈非空,然后将栈中元素逐个弹出,并按照步骤2计算矩形面积,并且更新最大值。

总结:若输入序列是是升序,那么依次入栈,让入栈元素小于栈顶,以栈顶元素为高的矩形左边界必然是将高出栈后新的栈顶元素的位置(因为是按升序入栈)。而栈中元素是按升序排列那么以栈中任意一个元素为高,必然可以和栈顶元素构成矩形,所以当即将入栈元素小于栈顶元素时,那么右边界即是这个入栈元素的索引位置。

下面是Java的实现代码。

public class Solution {public int largestRectangleArea(int[] height) {Stack<Integer> s = new Stack<>();int max_area = 0; // 最大矩形面积int tp; // 栈顶int area_with_top;int i = 0;int n = height.length;while (i < n) {if (s.empty() || height[s.peek()] <= height[i]) {s.push(i++);} else {tp = s.pop();area_with_top = height[tp] * (s.empty() ? i : i - s.peek() - 1);max_area = Math.max(max_area, area_with_top);}}while (!s.empty()) {tp = s.pop();area_with_top = height[tp] * (s.empty() ? i : i - s.peek() - 1);max_area = Math.max(max_area, area_with_top);}return max_area;}
}

直方图中最大矩形面积相关推荐

  1. c语言直方图最大矩形面积,利用枚举法求直方图中最大矩形面积的方法实例

    求直方图中的最大矩形面积: 例如给定直方图{2,3,1,2,4,2} 则直方图中最大矩形面积为x=(3,6),|x|=3,y=2,max面积=6 思考:利用枚举法 /*当前位置往前进行枚举法*/ pu ...

  2. c语言直方图最大矩形面积,直方图中最大矩形面积(示例代码)

    注意:本文并未对原文完整翻译,而是结合原文并根据本人理解写出,因此部分内容为完整翻译,部分内容为个人理解所写. Largest Rectangle in Histogram 直方图中最大矩形面积 一个 ...

  3. 每天一道LeetCode-----计算直方图中最大矩形的面积

    Largest Rectangle in Histogram 原题链接Largest Rectangle in Histogram 给定一个直方图,计算这个直方图中最大的矩形面积.输入的是直方图中每个 ...

  4. 直方图中最大的矩形(单调栈2)

    题目描述 直方图是由在公共基线处对齐的一系列矩形组成的多边形. 矩形具有相等的宽度,但可以具有不同的高度. 例如,图例左侧显示了由高度为2,1,4,5,1,3,3的矩形组成的直方图,矩形的宽度都为1: ...

  5. 计算直方图中面积最大的矩形

    CSDN编程挑战里的题目 给定直方图,每一小块的height由N个非负整数所确定,每一小块的width都为1,请找 出直方图中面积最大的矩形. 如下图所示,直方图中每一块的宽度都是1,每一块给定的高度 ...

  6. 庞果网之寻找直方图中面积最大的矩形

    题目详情 给定直方图,每一小块的height由N个非负整数所确定,每一小块的width都为1,请找出直方图中面积最大的矩形. 如下图所示,直方图中每一块的宽度都是1,每一块给定的高度分别是[2,1,5 ...

  7. 直方图中最大的矩形(遍历与单调栈)

    给定 n 个非负整数,用来表示柱状图中各个柱子的高度.每个柱子彼此相邻,且宽度为 1 . 求在该柱状图中,能够勾勒出来的矩形的最大面积. 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [ ...

  8. 二维矩阵中的最大矩形面积--java实现

    一.原题: 给你一个二维矩阵,权值为False和True,找到一个最大的矩形,使得里面的值全部为True,输出它的面积. 样例: 给你一个矩阵如下: [[1, 1, 0, 0, 1],[0, 1, 0 ...

  9. 01矩阵最大正方形面积、01矩阵最大矩形面积、直方图最大矩形面积

    01矩阵最大正方形面积 题意:给定一个矩阵,其中的元素为0或者1,要求找出其中元素全为1的面积最大的正方形. 题解:动态规划:对每个元素,把以其为右下角,元素全为1的正方形的最长边长记录下来.如果以元 ...

最新文章

  1. python3 进程池中使用队列Queue
  2. Jetson Xavier(Ubuntu18.04)安装固态硬盘并挂载到/home区下
  3. 【MaxCompute】学习笔记常用查询sql
  4. 你会怎样衡量你的产品? —— 一点产品数据分析的经验分享
  5. [BZOJ2324][ZJOI2011][最小费用最大流]营救皮卡丘
  6. ORA-00907:missing right parenthesis缺少右括号
  7. vm虚拟机win10无法复制文件_远程桌面无法复制粘贴传输文件解决办法
  8. jquery通过ajax方法获取json数据不执行success
  9. FFmpeg查看支持的封装、编解码器、滤镜(四)
  10. 过滤字符串 和 select选择后控件值变更
  11. 前端三大框架有哪些异同?
  12. 文字转语音怎么做?分享三种配音方法,真人语音很逼真
  13. c语言程序中TMOD,keil 中用c 语言写的代码 error C231: 'TMOD': redefinition
  14. 2022年自考专业考试(计算机应用)软件工程练习题
  15. 金代文化是中华民族文化的重要组成部分
  16. 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)
  17. 《生物化学与分子生物学》----糖酵解,柠檬酸---听课笔记(十五)
  18. 使用 Let's Encrypt 为 Zimbra-8.8.15 安装可信任的SSL证书
  19. MQTT协议之连接和心跳
  20. win10 omnet++5.6.2、INET3.7.0、sumo1.8.0 和 veins 安装记录

热门文章

  1. 【软件安装-UBUNTU】【OLD】手把手教你在Linux上运行IE浏览器
  2. python遇到can not import xxx错误
  3. 【追踪】山东曲阜孔林附近女子被斩首续:系凶手女友
  4. 语音合成10107错误码解决记录
  5. 方舟编译器HelloWorld
  6. 【读书笔记】少有人走的路
  7. 备份oracle错误12546,解决了ORACLE数据备份出现Message 206错误
  8. 带你了解Maven,并搞定安装和配置
  9. XMOS 开发探索0- 新建工程,刷入程序
  10. zedboard linux,ZedBoard