暴力解法,把每个元素位置都当成一次矩形的右下角,时间复杂度O(m^2n),空间复杂度O(1)。
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
m, n = len(matrix), len(matrix[0])
res = 0
for row in range(m):
matrix[row][0] = 1 if matrix[row][0] == "1" else 0
for row in range(m):
for col in range(1, n):
matrix[row][col] = matrix[row][col-1] + 1 if matrix[row][col] == "1" else 0
for row in range(m):
for col in range(n):
height = 0
width = matrix[row][col]
for r in range(row, -1, -1):
height += 1
if matrix[r][col] < width:
width = matrix[r][col]
res = max(res, width * height)
return res
单调栈,类似LC84-柱状图中最大的矩形,把它的解法和本题在融合到了一起,时间复杂度O(mn),空间复杂度O(n)。
class Solution:
def maximalRectangle(self, matrix) -> int:
m, n = len(matrix), len(matrix[0])
res = 0
for row in range(m):
matrix[row].append(0)
matrix[row].insert(0, 0)
stack = [0]
for col in range(1, n+2):
if row == 0:
matrix[row][col] = 1 if matrix[row][col] == "1" else 0
else:
matrix[row][col] = matrix[row-1][col] + 1 if matrix[row][col] == "1" else 0
while matrix[row][col] < matrix[row][stack[-1]]:
height = matrix[row][stack.pop()]
left = stack[-1]
area = (col - left - 1) * height
res = max(res, area)
stack.append(col)
return res