Leetcode 85. 最大矩形【单调栈】

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) 栈的长度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值