原題
給出的n個非負整數表示每個直方圖的高度,每個直方圖的寬均為1,在直方圖中找到最大的矩形面積。
給出 height = [2,1,5,6,2,3],返回 10 (5 * 2)
解題思路
- DP一般是把n!/nn/2n優化到n2/n3,而本題暴力解法是n^2,我們希望優化到n,不是DP的強項
- n^2 -> n (stack強項)
- 求出把每個柱子當做最小的得到的面積 -> 求出n個值,取min
- 通過維護一個升序stack,實現 -> 找到每個數左邊第一個比它小的和右邊第一個比它小的
# push 2
stack = [] -> [2]
# push 1 ,以為2 > 1,所以pop 2以維持升序stack
# 2左邊第一個比它小的就是none,右邊第一個比它小的就是1
stack = [2] -> [1]
- Conditional Operator in Python
# Java version
a > 10 ? b : c
# Python version
b if a > 10 else c
完整代碼
class Solution(object):
def largestRectangleArea(self, height):
"""
:type height: List[int]
:rtype: int
"""
if not height:
return 0
res = 0
stack = []
height.append(-1)
for i in range(len(height)):
current = height[i]
while len(stack) != 0 and current <= height[stack[-1]]:
h = height[stack.pop()]
w = i if len(stack) == 0 else i - stack[-1] - 1
res = max(res, h * w)
stack.append(i)
return res