class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
firstL = [-1] * len(heights)
firstR = [len(heights)] * len(heights)
result = 0
for i in range(1, len(heights)):
temp = i - 1
while temp >= 0 and heights[temp] >= heights[i]:
temp = firstL[temp]
firstL[i] = temp
for i in range(len(heights) - 2, -1, -1):
temp = i + 1
while temp < len(heights) and heights[temp] >= heights[i]:
temp = firstR[temp]
firstR[i] = temp
for i in range(len(heights)):
result = max(result, heights[i] * (firstR[i] - firstL[i] - 1))
return result
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
result = 0
stack = [0]
heights.insert(0, 0)
heights.append(0)
for i in range(1, len(heights)):
if heights[i] >= heights[stack[-1]]:
stack.append(i)
else:
while stack and heights[i] < heights[stack[-1]]:
mid = stack.pop()
if stack:
result = max(result, heights[mid] * (i - stack[-1] - 1))
stack.append(i)
return result