给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
思路:
本题是借助栈来实现的,即定义一个栈来保存单增序列,只要碰到一元素比栈顶元素的值小,立马将栈顶元素出栈,并依次循环计算栈里保存元素所构成的矩形面积,如下图所示:
代码如下:
class Solution:
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
# 定义遍历heights数组的下标值
i = 0
# 定义heights数组元素构成的面积最大值
max_value = 0
# 定义栈来保存单增序列
stack = []
# 此处较为巧妙。若heights数组中元素都是单增序列,则最后无法出栈stack,也就无法计算最大面积,所以补个0,使之最后可以出栈
heights.append(0)
while i < len(heights):
if len(stack) == 0 or heights[stack[-1]] <= heights[i]:
stack.append(i)
i += 1
else:
now_idx = stack.pop()
if len(stack) == 0:
max_value = max(max_value, i * heights[now_idx])
else:
max_value = max(max_value, (i - stack[-1] - 1) * heights[now_idx])
return max_value
if __name__ == "__main__":
heights = [2, 1, 5, 6, 2, 3]
max_volume = Solution().largestRectangleArea(heights)
print(max_volume)
不过执行效率依旧底下,在4%左右。