给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
[“1”,“0”,“1”,“0”,“0”],
[“1”,“0”,“1”,“1”,“1”],
[“1”,“1”,“1”,“1”,“1”],
[“1”,“0”,“0”,“1”,“0”]
]
输出: 6
思路
见84题https://blog.csdn.net/qq_37369124/article/details/87925635
遍历每一行,将从低部向上的连续1视为柱子
前一行
[“1”,“0”,“1”,“0”,“0”]
视为
[1,0,1,0,0],
前二行
[“1”,“0”,“1”,“0”,“0”],
[“1”,“0”,“1”,“1”,“1”],
视为
[2,0,2,1,1]
前三行
[“1”,“0”,“1”,“0”,“0”],
[“1”,“0”,“1”,“1”,“1”],
[“1”,“1”,“1”,“1”,“1”],
视为
[3,1,3,2,2]
前四行
[“1”,“0”,“1”,“0”,“0”],
[“1”,“0”,“1”,“1”,“1”],
[“1”,“1”,“1”,“1”,“1”],
[“1”,“0”,“0”,“1”,“0”]
视为[4,0,0,3,0]
每一行用84题的代码处理
代码
def maximalRectangle(self, matrix):
if not matrix or not matrix[0]:
return 0
n=len(matrix[0])
heights=[0]*(n + 1)
max_m=0
for row in matrix:
for i in range(n):
heights[i] = heights[i] + 1 if row[i] == '1' else 0
i = 0
stack=[]
while i < len(heights):
if len(stack) == 0 or heights[stack[-1]] <= heights[i]:
stack.append(i)
i=i+1
else:
while stack !=[] and heights[stack[-1]]>heights[i]:
a = stack.pop()
if stack == []:max_m = max(max_m,i * heights[a])
else: max_m = max(max_m,(i-stack[-1]-1) * heights[a])
return max_m