【leetcode】84. 柱状图中最大的矩形
原题地址:https://leetcode.cn/problems/largest-rectangle-in-histogram/
单调栈题目。保证栈中元素单调递增。
这个题实际上就是对于每个点找到左右第一个小于它高度的位置,就可求出以它为高的最大方块。
遍历,
遇到比栈顶元素代表高度小的位置,就不断出栈,直到heights[i] >= heights[s.top()],再把当前位置入栈;
遇到比栈顶元素代表高度大的位置,直接入栈
这样可以保证栈的单调性。
出栈的时候可以计算出栈的那个元素对应的最大方块。
当一个元素出栈时,右边界就是当前遍历位置,因为只有heights[i] < heights[s.top()]才会出栈。如果在它们之间有更小元素的话,那这个元素早已出栈,所以当前遍历位置就是出栈的元素的右边界
左边界就是当前元素出栈后的栈顶元素,这根据上面构造栈的方法可以得知。
这样高度和左右边界都知道了。就可以求出对应的最大方块。
'''
单调栈
'''
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
s = [-1]
heights.append(0)
n = len(heights)
ret = 0
for i in range(n):
cur = heights[i]
while len(s) != 0 and heights[s[-1]] > cur:
height = heights[s[-1]]
s.pop()
left = s[-1] if len(s) != 0 else 0
right = i
ret = max(ret, height * (right - left - 1))
s.append(i)
return ret

浙公网安备 33010602011771号