84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
思路:
双指针(dp):想得到最大的矩形,遍历所有元素,以该元素为高,往左右尽可能取最长的宽。取所有的这样的矩形的面积最大值。
class Solution:
def largestRectangleArea(self, heights):
left_dp = [0 for _ in range(len(heights))]
right_dp = [0 for _ in range(len(heights))]
left_dp[0] = -1
right_dp[-1] = len(right_dp)
ans = 0
for i in range(1, len(heights)): # 求每一列左边第一根低于当前高度的柱子
temp = i - 1
while temp > -1 and heights[temp] >= heights[i]:
temp = left_dp[temp] # 转移到左边第一根低于temp柱子高度的柱子比temp低的(dp)
left_dp[i] = temp
for j in range(len(heights) - 2, -1, -1): # 求每一列右边最高的柱子
temp = j + 1
while temp < len(heights) and heights[temp] >= heights[j]:
temp = right_dp[temp]
right_dp[j] = temp
for k in range(len(heights)):
area = heights[k] * (right_dp[k] - left_dp[k] - 1)
ans = max(area, ans)
print(left_dp, right_dp)
return ans
单调栈:取雨水时找凹陷,这次相当于找凸起,找所有的凸起中面积最大的凸起
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
heights.insert(0, 0)
heights.append(0)
stack = [0]
result = 0
for i in range(1, len(heights)):
while stack and heights[i] < heights[stack[-1]]:
mid_height = heights[stack[-1]]
stack.pop()
if stack: # 更新最大值作为result
area = (i - stack[-1] - 1) * mid_height
result = max(area, result)
stack.append(i)
return result