LeetCode #85 Maximal Rectangle
题目
解题方法
力扣上赞数最高的方法,花了一天时间有点搞懂了,妙啊。我用题目的例子来记录一下,以题目给的例子为例。
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
TA用了三个辅助数组,left,right,height,长度为矩阵的长n,即len(matrix[0]),left和height初始化全为0,right初始化全为n,m是矩阵的宽len(matrix),其中三个数组分别的含义是:
-
left: left中的每一位分别对应当前遍历到的行的每一位,意味着在矩阵的已经遍历过的所有行中,和当前位置的1横向相连的1的最左端位置的下标,如果当前位置是0,就将其赋值为0。再简单一点说,就是找到1之后,看它上面所有1所在的矩形的最左端位置。
比如上面这个矩阵的第一行,在遍历结束后left就是[0, 0, 2, 0, 0]。left的第一位是0,因为矩阵中第一行第一个位置的下标就是0;left的第二位是0,因为矩阵中第一行的第二个位置的值是0;left的第三位是2,因为矩阵中第一行第三个位置的下标是2;后面的0以此类推。
当进行到第二行时,left的每个位置又对应第二行里面的每一位,所以第二行结束后的left=[0, 0, 2, 2, 2],第一个0同样是因为矩阵中第二行第一个位置的下标就是0;而3、4、5位置的2则是因为在矩阵中它们是相连的1,起始位置都是一样的,都是第一个1的下标2。
第三行结束的left=[0, 0, 2, 2, 2],后面三个仍然是2的原因是matrix[1][1]=0,它们在纵向上不能连续到0的位置,最多只能到下标为2的位置。
同理,第四行结束的left=[0, 0, 0, 3, 0]。 -
right: right和left正好相反,找的是右端位置,而且不同于left找到最左端的下标,right找的是最右端的后一位的下标。这里我直接给出四行分别遍历结束后的right值:
第一行right: [1, 5, 3, 5, 5]
第二行right: [1, 5, 3, 5, 5]
第三行right: [1, 5, 3, 5, 5]
第四行right: [1, 5, 5, 4, 5] -
height: height存放的是这一列的高度,是一个累加值,如果当前行中有某个位置为0,则这次的height=0,否则均在之前height的基础上累加。
第一行height: [1, 0, 1, 0, 0]
第二行height: [2, 0, 2, 1, 1]
第三行height: [3, 1, 3, 2, 2]
第四行height: [4, 0, 0, 3, 0]
于是针对每一个位置j,可以计算矩形面积:
Area = (right[j] - left[j]) * height[j])
值得注意的是,这个面积是以它所在列的所有1的个数为宽,所在列的所有1的横向延申长度为长的矩形面积,而不是它所在的最大矩形面积,因此我们可以通过对Area求最大值得到最大矩形面积。
maxA = max(maxA, (right[j] - left[j]) * height[j])
代码
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
if not matrix or not matrix[0]:
return 0
m = len(matrix)
n = len(matrix[0])
left = []
right = []
height = []
for i in range(n):
left.append(0)
right.append(n)
height.append(0)
maxA = 0
for i in range(m):
cur_left = 0
cur_right = n
for j in range(n):
if matrix[i][j] == '1':
height[j] += 1
else:
height[j] = 0
for j in range(n):
if matrix[i][j] == '1':
left[j] = max(left[j], cur_left)
else:
left[j] = 0
cur_left = j + 1
for j in range(n-1, -1, -1):
if matrix[i][j] == '1':
right[j] = min(right[j], cur_right)
else:
right[j] = n
cur_right = j
for j in range(n):
maxA = max(maxA, (right[j] - left[j]) * height[j])
return maxA

浙公网安备 33010602011771号