42.接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
class Solution:
def trap(self, height: List[int]) -> int:
stack = []
ans = 0
for i, h in enumerate(height):
while stack and height[stack[-1]] < h:
cur = stack.pop()
if not stack: break
l = stack[-1]
ans += (min(height[l], h) - height[cur]) * (i - l - 1)
stack.append(i)
return ans
84. 柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
stack = [-1]
heights.append(0)
res = 0
for i, v in enumerate(heights):
while heights[stack[-1]] > v:
index = stack.pop()
res = max(res, heights[index]*(i - stack[-1] - 1))
stack.append(i)
return res
85.最大矩形
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
if not matrix or not matrix[0]: return 0
m, n = len(matrix), len(matrix[0])
cnt = [0] * (n + 1)
ans = 0
for i in range(m):
for j in range(n):
cnt[j] = cnt[j] + 1 if matrix[i][j] == '1' else 0
stack = [-1]
for k, v in enumerate(cnt):
while cnt[stack[-1]] > v:
index = stack.pop()
ans = max(ans, cnt[index]*(k - stack[-1] - 1))
stack.append(k)
return ans