初步思路:接雨水
总结:
- def largestRectangleArea(self, heights: List[int]) -> int:
-
- '''
- 找每个柱子左右侧的第一个高度值小于该柱子的柱子
- 单调栈:栈顶到栈底:从大到小(每插入一个新的小数值时,都要弹出先前的大数值)
- 栈顶,栈顶的下一个元素,即将入栈的元素:这三个元素组成了最大面积的高度和宽度
- 情况一:当前遍历的元素heights[i]大于栈顶元素的情况
- 情况二:当前遍历的元素heights[i]等于栈顶元素的情况
- 情况三:当前遍历的元素heights[i]小于栈顶元素的情况
- '''
-
- heights.insert(0, 0)
-
- heights.append(0)
-
- stack = [0]
-
- result = 0
-
- for i in range(1, len(heights)):
-
- # 情况一
-
- if heights[i] > heights[stack[-1]]:
-
- stack.append(i)
-
- # 情况二
-
- elif heights[i] == heights[stack[-1]]:
-
- stack.pop()
-
- stack.append(i)
-
- # 情况三
-
- else:
-
- # 抛出所有较高的柱子
-
- while stack and heights[i] < heights[stack[-1]]:
-
- # 栈顶就是中间的柱子,主心骨
-
- mid_index = stack[-1]
-
- stack.pop()
-
- if stack:
-
- left_index = stack[-1]
-
- right_index = i
-
- width = right_index - left_index - 1
-
- height = heights[mid_index]
-
- result = max(result, width * height)
-
- stack.append(i)
-
- return result
用时:60分钟