题目链接:https://leetcode-cn.com/problems/maximal-rectangle/
题目描述
给定一个仅包含 0 和 1 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。
示例:
输入:
[
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出: 6
思路
1 使用柱状图的优化暴力方法
设置二维数组dp
,dp[i][j]
表示以该坐标结束的矩形的最大可能宽度。
dp[i][j] = dp[i][j-1] + 1 if matrix[i][j] == '1'
一旦我们知道每个点对应的最大宽度,就可以以线性时间内计算出以该点为右下角的最大矩形。我们从该位置第i
行往上遍历该列,可以得到从初始点(i,j)到当前点矩形的最大宽度,就是我们遇到的每个最大宽度d[k][j]的最小值。
我们定义
currentWidth = max(currentWidth, dp[i][k])
currentArea = currentWidth * (i - k + 1)
maxArea = max(maxArea, currentArea)
对每个点重复这一过程,就可以得到全局最大。
注意,我们预计算最大宽度的方法事实上将输入转化成了一系列的柱状图,每一栏是一个新的柱状图。我们在针对每个柱状图计算最大面积。
于是,上述方法本质上是 84 - 柱状图中最大的矩形 题中优化暴力算法的复用。
复杂度分析
时间复杂度: O ( m 2 n ) O(m^2n) O(m2n)
空间复杂度: O ( m n ) O(mn) O(mn)
m,n为输入矩阵的行列数
2 动态规划-每个点的最大高度
想象一个算法,对于每个点我们会通过以下步骤计算一个矩形:
不断向上方遍历,直到遇到“0”,以此找到矩形的最大高度。
向左右两边扩展,直到无法容纳矩形最大高度。
例如,找到黄色点对应的矩形: