Leetcode 85. 最大矩形
困难题; 本题是84题柱状图中最大的矩形的延申版本,同样可以使用单调栈来解决
题目
给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例1
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:6
解释:最大矩形如上图所示。
示例2
输入:matrix = []
输出:0
示例3
输入:matrix = [["0"]]
输出:0
示例4
输入:matrix = [["1"]]
输出:1
示例5
输入:matrix = [["0","0"]]
输出:0
提示
- rows == matrix.length
- cols == matrix[0].length
- 1 <= row, cols <= 200
- matrix[i][j] 为 ‘0’ 或 ‘1’
解法
先得到每一行的连续情况,时间复杂度为O(mn);
得到每一行的连续情况后,对于每一列都相当于84题柱状图中最大的矩形题解中求柱状图的最大矩形面积。利用单调栈求以当前列为边界的最大矩形面积,遍历所有列得到整个矩阵的最大矩形面积,该时间复杂度为O(mn);
代码中在针对每一列处理时,在末尾增加了一个哨兵(-1),清算最后栈中所有的数值。
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
stack, res = [], 0
m, n = len(matrix), len(matrix[0])
for i in range(m): # 对每一行遍历,每一行中以j为结尾的最大矩形面积
for j in range(0,n):
if j==0: matrix[i][j] = int(matrix[i][j])
else: matrix[i][j] = int(matrix[i][j-1])+1 if int(matrix[i][j]) else 0
matrix.append([-1 for _ in range(len(matrix[0]))]) # 哨兵
for j in range(n): # 对每一列遍历 将其看为求柱状体的最大面积
for i in range(m+1):
while stack and matrix[i][j] < matrix[stack[-1]][j]:
cur = stack.pop()
left = stack[-1] if stack else -1
res = max(res, matrix[cur][j]*(i-1-left)) #高度乘以宽度,具体细节参见84题解
stack.append(i)
stack.pop() #最后哨兵
return res
- 时间复杂度: O(mn) 【两次O(mn)】
- 空间复杂度: O(m) 栈的长度