Largest Rectangle in a Histogram 题解 Python
本题来源于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相关推荐
- 【Python CheckiO 题解】Largest Rectangle in a Histogram
CheckiO 是面向初学者和高级程序员的编码游戏,使用 Python 和 JavaScript 解决棘手的挑战和有趣的任务,从而提高你的编码技能,本博客主要记录自己用 Python 在闯关时的做题思 ...
- Largest Rectangle in a Histogram (动态规划+奇思妙想单调栈)求最大矩状图面积
感觉动态规划都是玄妙的很,思维题吧(单调栈思维) 题解:让求最大矩形面积,宽为1,暴力超时 可以发现 当第i-1个比第i个高的时候 比第i-1个高的所有也一定比第i个高 于是可以用到动态规划的 ...
- poj 2559 Largest Rectangle in a Histogram 栈
// poj 2559 Largest Rectangle in a Histogram 栈 // // n个矩形排在一块,不同的高度,让你求最大的矩形的面积(矩形紧挨在一起) // // 这道题用的 ...
- HDU 1506 Largest Rectangle in a Histogram(dp、单调栈)
你是不是飘了?骚年! Problem Description A histogram is a polygon composed of a sequence of rectangles aligned ...
- 【单调栈】Largest Rectangle in a Histogram(luogu-SP1805/poj 2559)
Largest Rectangle in a Histogram luogu-SP1805 poj 2559 题目大意: 有n个并排的矩阵,高度为aia_iai,宽度为1,现在让求包含于这些矩阵的并 ...
- *【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 ...
- Largest Rectangle in a Histogram HDU - 1506 解题思路 单调栈
原题目 Problem Description A histogram is a polygon composed of a sequence of rectangles aligned at a c ...
- hdu 1506 Largest Rectangle in a Histogram 最大矩形
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1506 Largest Rectangle in a Histogram Time Limit: 20 ...
- 题解 POJ 2559-SP1805 【HISTOGRA - Largest Rectangle in a Histogram】
题目链接: https://www.luogu.org/problemnew/show/SP1805 http://poj.org/problem?id=2559 思路: ## 单调栈 首先如果所有矩 ...
- Largest Rectangle in a Histogram
ps:单调栈,注意红色部分的代码. int n;stack<P> s;inline void upd(LL &x, LL y) { (x < y) && (x ...
最新文章
- 如何使用 Python 或 Bash动态生成 Jekyll 配置文件
- 使用jsoup解析html
- Redis开发运维实践问题处理只内存检查
- IIR+双向滤波实现系统零相位相移_MATLAB仿真
- [IDEA 配置MYSQL数据库连接]
- 编写一个弹出式菜单的shell程序_分享一个有趣的shell脚本--实现抓阄程序
- 【正睿2021寒假省选第二轮集训 day 1】串 (后缀自动机+记忆化)
- java聊天室需求分析_java聊天室源程序需求分析2业务需求2.1。与电视聊天
- JavaEE项目 Web聊天室(JSP实现)
- python爬取一条新闻内容_一个爬取近百万数据的Python爬虫
- 软工网络15团队作业4——Alpha阶段敏捷冲刺之Scrum 冲刺博客(Day7)
- 阿里云服务器ECS接入多IP_ECS绑定多个弹性公网IP搭建教程
- Axure 实现问卷调查(带计时器功能)
- keras的seq2seq
- 系统的学习linux
- 程序员的福利:源码直卖网
- 国税发票查验API接口说明
- ABI Research产业研究:ZiFiSense如何革新物流货物及运输包装追踪
- 超级招聘会落地武汉,钉钉为何“不务正业”力推新校招?
- tp5路径怎样去掉index.php,tp5如何隐藏index.php文件