对每一个元素找到后面第一个比自己小的元素,属于单调栈(单调递增)问题。
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
# 在heights的首尾增加两个哨兵元素0:
# 首部是为了循环中不用判断stack是否为空;
# 尾部是为了保证原heights数组中所有元素可以出栈。
heights.append(0)
heights = [0] + heights
n = len(heights)
stack = [0]
res = 0
for i in range(1, n):
# 遇到元素严格小于栈顶元素时,即可进行出栈操作,并不断更新最大面积
while heights[i] < heights[stack[-1]]:
height = heights[stack.pop()]
left = stack[-1]
area = (i - left - 1) * height
res = max(res, area)
stack.append(i)
return res