方法一:暴力法
class Solution:
"""
思路:比较第i个位置最大的面积,以i为中心,找左右边界 --(超出时间限制)
"""
def largestRectangleArea(self, heights: List[int]) -> int:
maxarea = 0
for i in range(len(heights)) :
left = i
right = i
while left >= 0 and heights[left] >= heights[i] : left -= 1
while right < len(heights) and heights[right] >= heights[i] : right += 1
maxarea = max(maxarea,heights[i] * (right - left - 1))
return maxarea
方法二:栈
class Solution:
"""
思路:维护一个单调递增的栈 --遇见更小的元素即找到左右边界
"""
def largestRectangleArea(self, heights: List[int]) -> int:
stack = [] #存储索引
heights = [0] + heights + [0] #第一个零用于计算弹出最后一个柱子后栈里还有值
max_area = 0 #第二个零把所有数都弹出
for i in range(len(heights)) :
while stack and heights[i] < heights[stack[-1]] : #遇见更小的元素则弹出
j = stack.pop() #弹出以后 栈顶元素就会改变
max_area = max(max_area,heights[j] * (i - stack[-1] - 1))
stack.append(i) #即将加入的元素 - 栈顶元素 - 本身的大小 = 右边界 - 左边界 - 本身大小
return max_area