题目描述:
方法一:O(N) O(N)
class Solution: def largestRectangleArea(self, heights: List[int]) -> int: if not heights: return 0 n = len(heights) left_i = [0] * n right_i = [0] * n left_i[0] = -1 right_i[-1] = n for i in range(1, n): tmp = i - 1 while tmp >= 0 and heights[tmp] >= heights[i]: tmp = left_i[tmp] left_i[i] = tmp for i in range(n - 2, -1, -1): tmp = i + 1 while tmp < n and heights[tmp] >= heights[i]: tmp = right_i[tmp] right_i[i] = tmp # print(left_i) # print(right_i) res = 0 for i in range(n): res = max(res, (right_i[i] - left_i[i] - 1) * heights[i]) return res
方法二:栈 O(N)
class Solution: def largestRectangleArea(self, heights: List[int]) -> int: stack = [] heights = [0] + heights + [0] res = 0 for i in range(len(heights)): #print(stack) while stack and heights[stack[-1]] > heights[i]: tmp = stack.pop() res = max(res, (i - stack[-1] - 1) * heights[tmp]) stack.append(i) return res