[LeetCode] 84. Largest Rectangle in Histogram
发布日期:2021-05-04 09:02:31 浏览次数:21 分类:技术文章

本文共 1487 字,大约阅读时间需要 4 分钟。

Given n non-negative integers representing the histogram’s bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

这里写图片描述

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

这里写图片描述

The largest rectangle is shown in the shaded area, which has area = 10 unit.

For example,

Given heights = [2,1,5,6,2,3],
return 10.

寻找柱状图中的最大矩形,给出的是柱状图的一系列高度值,每个值对应的水平宽度为1。

显然,可以通过暴力方法求解这个题,也即是,每次求出区间[i,j]的最小值,然后乘以对应宽度,得到当前[i,j]内的矩形面积,但这样的时间复杂度为o(n^2),会超时

一个比较巧妙的办法是借助栈实现,思路描述如下:

在栈index中,依次保存使得高度升序的一系列索引值,
1. 当前索引值为i时,如果当前i对应的高度大于index栈顶对应的高度,则将i索引push进栈中,
2. 如果当前i的高度是小于栈顶高度,则将栈顶元素pop出来,并计算栈顶(下一个)索引和i之间的矩形面积
这样,时间复杂度为o(n)

注释1:一个问题是,为什么可以这样呢?嗯,仔细思考一下,实际上,当我们进行pop操作时,取出来的高度就是下一栈顶和当前i之间的最小高度值(注意不包括栈顶和i,是开区间),因为凡是比当前高度大的值,在pop出当前高度的时候,就已经被pop出来了(因为栈内始终是升序呀),这样也就计算出了一系列矩形面积值。

注释2:另外,这种优化也是十分巧妙的,因为它避免了大量重复的运算,当一个序列为递增序列时,例如{1,2,3,4},如果我们采用暴力方法计算时,对于任意区间[i,j],因为首元素始终是最小的,所以后续一系列区间(增加j时)的计算其实都是没有必要的,但是利用栈,将这种计算延后(实际上也通过栈来帮助我们识别出这种单调性),每次pop出的时候再计算,简化了一系列重复计算的步骤。

注释3:单调栈

class Solution {public:    int largestRectangleArea(vector
& heights) { heights.push_back(0); int n=heights.size(),i=0,maxArea=0; stack
index; while(i
=heights[index.top()]) index.push(i++); else{ int tp=index.top(); index.pop(); maxArea=max(maxArea,heights[tp]*(index.empty()?i:i-index.top()-1)); } } return maxArea; }};
上一篇:4091:最近餐馆
下一篇:1144. The Missing Number (20)

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年03月18日 15时51分48秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

计算机专业【本科生】毕业还不如【专科生】? 2019-03-03
考研408联盟新添一所985!某知名大学专业课改用408! 2019-03-03
最有钱的大学是哪个?教育部直属高校公布2018年决算 2019-03-03
408的逆袭!武汉大学所有计算机/软件专业都改为408! 2019-03-03
408又多一所学校!广东某大学专业课改为408! 2019-03-03
【报名问题】考研现场确认时发现报考点选错了怎么办? 2019-03-03
100000+人体验过后都说:这TM绝对是最变态的英语学习方法…… 2019-03-03
广东省将新增一所“中科大”,办学规模初定1万人! 2019-03-03
提醒 | 未下载打印准考证的考生,不能参加2020年考研初试 2019-03-03
【调剂】2020年中科院上海光机所接收报考硕士研究生调剂生的通知 2019-03-03
【调剂】其它计算机/软件调剂信息 20.4.21 2019-03-03
【调剂】211 内蒙古大学计算机学院2020年拟接收调剂硕士研究生公告 2019-03-03
【调剂】浙江理工大学2020年硕士研究生调剂信息 2019-03-03
【调剂】华侨大学媒体分析与数据挖掘小组招收学硕调剂生 2019-03-03
分数线385!平均分399!985大学计算机的真正“实力”! 2019-03-03
【调剂】211云南大学2020年硕士研究生招生调剂通知 2019-03-03
【调剂】985复旦大学类脑智能科学与技术研究院硕士研究生招生接收校内调剂考生工作细则... 2019-03-03
【调剂】沈阳航空航天大学2020年硕士研究生调剂信息 2019-03-03
清华大学来山东了,成立新研究院! 2019-03-03
最新!薪酬最高的大学本科专业公布! 2019-03-03