本题来源于checkio,LeetCode上也有这个题,下面看一下题目。
You have a histogram. Try to find size of the biggest rectangle you can build out of the histogram bars.

Input: List of all rectangles heights in histogram

Output: Area of the biggest rectangle

题目的要求是找出直方图中的最大矩形的大小,直方图以一个列表的形式给出,每个数字代表着对应的高度,例如上图所示,最大矩形的大小为8。

这道题需要使用单调栈,所谓单调栈就是栈中元素,按递增顺序或者递减顺序排列

先给出代码,然后在讲解思路

def largest_histogram(histogram):stack = list()heights = [0] + histogram + [0]N = len(heights)res = 0for i in range(N):while stack and heights[stack[-1]] > heights[i]:cur = stack.pop()res = max(res, (i - stack[-1] - 1) * heights[cur])stack.append(i)return resif __name__ == "__main__":#These "asserts" using only for self-checking and not necessary for auto-testingassert largest_histogram([5]) == 5, "one is always the biggest"assert largest_histogram([5, 3]) == 6, "two are smallest X 2"assert largest_histogram([1, 1, 4, 1]) == 4, "vertical"assert largest_histogram([1, 1, 3, 1]) == 4, "horizontal"assert largest_histogram([2, 1, 4, 5, 1, 3, 3]) == 8, "complex"print("Done! Go check it!")

我们这里需要用到的是递增栈,如果栈顶元素小于下一个元素(假设为a),那么a入栈,否则将栈中大于a的元素弹出并计算矩形的大小。

这里我们在原始列表的基础上在首尾添加了0元素,添加第一个0是为了通过索引计算宽度,添加最后的0是为了将栈中的非零元素弹出。

我们拿图中的例子来走一遍流程,首先将[2, 1, 4, 5, 1, 3, 3]添加0,[0, 2, 1, 4, 5, 1, 3, 3, 0]
通过一个变量cur来保存矩形的大小,每次计算矩形大小后保存较大的那一个,每次出栈都计算一次矩形的大小,矩形的大小=弹出元素的高度x弹出元素与当前元素的宽度

[0, 2, 1, 4, 5, 1, 3, 3, 0] 列表

[0, 1, 2, 3, 4, 5, 6, 7, 8] 列表的索引

首先,栈为空,0入栈,栈的状态为[0],然后2入栈(注意,我们是将对应的索引入栈,为了方便计算,不然直接将元素入栈还需要额外记录位置),此时栈的状态为[0, 1]

由于2 > 1, 所以需要将2出栈,此时栈的状态为[0], 计算矩形大小,2 * (2 - 0 -1)= 2,这时候第一个0的作用就体现出来了,保证栈不为空,方便计算宽度,然后1入栈,此时栈的状态[0, 2]

然后4入栈5入栈,此时栈的状态[0, 2, 3, 4]。 下一个元素为1,需要将4和5弹出,首先5出栈,栈的状态[0, 2, 3],计算矩形大小 5 * (5 - 3 -1)= 5,4出栈,栈的状态[0, 2] , 计算矩形大小4 * (5 - 2 -1) = 8。1入栈,此时栈的状态[0, 2, 5]

然后3入栈[0, 2, 5, 6],下一个3入栈[0, 2, 5, 6, 7],此时栈中索引对应的元素已经是一个非递减序列了,所以最后一个0的作用来了,将栈中剩下的非零元素出栈并计算矩形大小。

首先是3出栈[0, 2, 5, 6],矩形大小为3 * (8 - 6 -1) = 3, 然后另一个3出栈,[0, 2, 5], 矩形大小为3 * (8 - 5 -1) = 6

1出栈[0, 2],矩形大小为1 * (8 - 2 -1) = 5,另一个1出栈[0],矩形大小为1 * (8 - 0 -1) = 7。

所以最终的结果为8(最大矩形的大小)

参考知乎单调栈

Largest Rectangle in a Histogram 题解 Python相关推荐

  1. 【Python CheckiO 题解】Largest Rectangle in a Histogram

    CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思 ...

  2. Largest Rectangle in a Histogram (动态规划+奇思妙想单调栈)求最大矩状图面积

    感觉动态规划都是玄妙的很,思维题吧(单调栈思维) 题解:让求最大矩形面积,宽为1,暴力超时 可以发现   当第i-1个比第i个高的时候   比第i-1个高的所有也一定比第i个高 于是可以用到动态规划的 ...

  3. poj 2559 Largest Rectangle in a Histogram 栈

    // poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...

  4. HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)

    你是不是飘了?骚年! Problem Description A histogram is a polygon composed of a sequence of rectangles aligned ...

  5. 【单调栈】Largest Rectangle in a Histogram(luogu-SP1805/poj 2559)

    Largest Rectangle in a Histogram luogu-SP1805 poj 2559 题目大意: 有n个并排的矩阵,高度为aia_iai​,宽度为1,现在让求包含于这些矩阵的并 ...

  6. *【HDU - 1506】【POJ - 2559】Largest Rectangle in a Histogram(单调栈或动态规划)

    题干: Description A histogram is a polygon composed of a sequence of rectangles aligned at a common ba ...

  7. Largest Rectangle in a Histogram HDU - 1506 解题思路 单调栈

    原题目 Problem Description A histogram is a polygon composed of a sequence of rectangles aligned at a c ...

  8. hdu 1506 Largest Rectangle in a Histogram 最大矩形

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1506 Largest Rectangle in a Histogram Time Limit: 20 ...

  9. 题解 POJ 2559-SP1805 【HISTOGRA - Largest Rectangle in a Histogram】

    题目链接: https://www.luogu.org/problemnew/show/SP1805 http://poj.org/problem?id=2559 思路: ## 单调栈 首先如果所有矩 ...

  10. Largest Rectangle in a Histogram

    ps:单调栈,注意红色部分的代码. int n;stack<P> s;inline void upd(LL &x, LL y) { (x < y) && (x ...

最新文章

  1. 如何使用 Python 或 Bash动态生成 Jekyll 配置文件
  2. 使用jsoup解析html
  3. Redis开发运维实践问题处理只内存检查
  4. IIR+双向滤波实现系统零相位相移_MATLAB仿真
  5. [IDEA 配置MYSQL数据库连接]
  6. 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序
  7. 【正睿2021寒假省选第二轮集训 day 1】串 (后缀自动机+记忆化)
  8. java聊天室需求分析_java聊天室源程序需求分析2业务需求2.1。与电视聊天
  9. JavaEE项目 Web聊天室(JSP实现)
  10. python爬取一条新闻内容_一个爬取近百万数据的Python爬虫
  11. 软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day7)
  12. 阿里云服务器ECS接入多IP_ECS绑定多个弹性公网IP搭建教程
  13. Axure 实现问卷调查(带计时器功能)
  14. keras的seq2seq
  15. 系统的学习linux
  16. 程序员的福利:源码直卖网
  17. 国税发票查验API接口说明
  18. ABI Research产业研究:ZiFiSense如何革新物流货物及运输包装追踪
  19. 超级招聘会落地武汉,钉钉为何“不务正业”力推新校招?
  20. tp5路径怎样去掉index.php,tp5如何隐藏index.php文件

热门文章

  1. 《.NET程序员面试秘籍》读书笔记
  2. Eslint+Prettier 实现代码 git 提交时自动格式化及修复
  3. Windows超级管理器,电脑必备神器,内置超多实用小工具,帮你解决电脑相关问题!
  4. C——识别键盘按下模拟键盘按下
  5. 全面剖析canonical标签
  6. 如何在Ubuntu上使用Canonical的Livepatch服务
  7. 什么是RST包,什么是三次握手,什么是四次握手 ---请进
  8. 系统架构师从入门到精通1.0 Ceph集群部署无报错流畅版本
  9. Moniter和Lock
  10. 大英博物馆天猫开店,本王的宝贝都要被你们玩坏啦!