给定一个由 0 和 1 组成的矩阵 matrix ,找出只包含 1 的最大矩形,并返回其面积。
注意: 此题 matrix 输入格式为一维 01 字符串数组。
示例 1:

输入:matrix = ["10100","10111","11111","10010"]
输出:6
解释:最大矩形如上图所示。
思路:
我们首先计算出矩阵的每个元素的左边连续 1 的数量,使用二维数组oneHeight 记录,其中oneHeightij 为矩阵第 i 行第 j 列元素的左边连续 1 的数量。
接下来是对84题柱状图中最大的矩形------单调栈的集大成者-CSDN博客 的轻微进阶。对每一列都按84题处理,即求以当前列为底的最大矩形面积。遍历所有列后求得全局最大面积。
python
from typing import List
class Solution:
def maximalRectangle(self, matrix: List[str]) -> int:
if len(matrix) == 0 or len(matrix[0]) == 0:
return 0
m,n=len(matrix),len(matrix[0])
oneHeight = [[0 for _ in range(n)] for _ in range(m)]
for i in range(m):
for j in range(n):
if matrix[i][j] == '1':
before=oneHeight[i][j - 1] if j > 0 else 0
oneHeight[i][j] = before + 1
res=0
for j in range(n):
stack = []
leftMin=[-1]*m
rightMin=[m]*m
for i in range(m):
while stack and oneHeight[stack[-1]][j]> oneHeight[i][j]:
i1=stack.pop()
rightMin[i1]=i
leftMin[i]=stack[-1] if stack else -1
stack.append(i)
for i in range(m):
res=max(res,(rightMin[i]-leftMin[i]-1)*oneHeight[i][j])
return res
print(Solution().maximalRectangle(["1"]))