84题的升级版。将到每个位置的最长的连续序列长度记录到left数组中,就转化为了85题了。
切记,写完代码,一定先要看特殊情况,测完所有样例,之后算时间复杂度**,最好是在写代码之前就算好。
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
if not matrix:
return 0
row = len(matrix)
col = len(matrix[0])
left = [[0 for i in range(col)] for j in range(row)]
for i in range(row):
for j in range(col):
if matrix[i][j] == '0':
left[i][j] = 0
continue
if j != 0:
left[i][j] = left[i][j-1]+1
else:
left[i][j] = 1
result = 0
# 84题中方法
def maxMatrix(j):
stack = [0]
tmp_result = 0
for k in range(1, row+1):
r = k
if k == row:
while stack:
h = left[stack.pop()][j]
l = 0
if stack:
l = stack[-1]+1
tmp_result = max(tmp_result, h*(r-l))
while stack and left[k][j] < left[stack[-1]][j]:
h = left[stack.pop()][j]
l = 0
if stack:
l = stack[-1]+1
tmp_result = max(tmp_result, h*(r-l))
stack.append(k)
return tmp_result
for j in range(col):
tmp_result = maxMatrix(j)
result = max(result, tmp_result)
return result