Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
题目要求最大的只含有1的矩形。
算法是, 计算每个点能向上连续为1的线段长度H[i][j], 这个线段能往左边拓展的位置L[i][j], 能往右边拓展的位置R[i][j]。
如图所示,对于点A来说,向上连续为1的红箭头长度为4,H[4][1] = 4。这个红箭头向左右拓展为矩形,能移动到最左边的位置L[4][1] = 1, 能移动到最右边的位置R[4][1] = 2(L包含在矩阵内,R不包含)。点A对应的矩形面积就是H * (R - L) = 4。
对于点B,H[3][2] = 3, L[3][2] = 1, R[3][2] = 4。对应的面积H * (R - L) = 9。遍历所有点,求最大的面积。因为计算是只会用一次H, L, R的数据,所以用一维数组而不是二维数组来计算。
但是,当我们在数这个矩形的时候越来越像leetcode_question_85 Largest Rectangle in Histogram这道题了,不是吗?我们讨论了柱状图的最大矩形面积,那可以O(n)的,学以致用呀!btw,leetcode的这两题也是挨一块儿的,用心良苦。。。。
上面的矩阵就成这样了:
每一行都是一次柱状图的最大矩形面积了。dp[i][j]就是当前的第j列到第i行连续1的个数。