这个题解采用了单调栈的方法。主要思路是:逐行遍历矩阵,并维护一个高度数组 heights,heights[j] 表示第 j 列当前的连续 1 的高度。对于每一行,利用单调栈求解以当前行作为矩形底边的最大矩形面积。具体做法是,遍历高度数组,对于每个高度,利用单调栈找到左右两侧第一个小于它的位置,计算以当前高度为矩形的高、左右位置的差值为矩形的宽,求出面积并更新全局最大面积。
时间复杂度: O(m * n)
空间复杂度: O(n)
class Solution:
def solve(self, heights):
# 在高度数组首尾添加哨兵值 0,简化边界条件处理
heights = [0] + heights + [0]
stk = []
res = 0
for i, h in enumerate(heights):
while stk and h < heights[stk[-1]]:
j = stk.pop() # 当前矩形的高度
k = stk[-1] # 左边界的下标
width = i - k - 1 # 矩形的宽度
res = max(res, width * heights[j]) # 更新最大面积
stk.append(i)
return res
def maximalRectangle(self, matrix: List[List[str]]) -> int:
if not matrix:
return 0
m = len(matrix)
n = len(matrix[0])
heights = [0] * n # 存储每一列的高度
ans = 0
for i in range(m):
for j in range(n):
if matrix[i][j] == '1':
heights[j] += 1 # 如果当前位置是 1,高度加 1
else:
heights[j] = 0 # 如果当前位置是 0,高度重置为 0
ans = max(ans, self.solve(heights)) # 求解以当前行为底的最大矩形面积
return ans