Problem
# Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
#
# For example, given the following matrix:
#
# 1 0 1 0 0
# 1 0 1 1 1
# 1 1 1 1 1
# 1 0 0 1 0
# Return 6.
Idea
From LeetCode 笔记系列 18 Maximal Rectangle [学以致用]:
如果我们把每一行看成x坐标,那高度就是 从那一行开始往上数的1的个数 。
带入我们的maxAreaInHist方法,在O(n2)时间内就可以求出每一行形成的“柱状图”的最大矩形面积了。
它们之中最大的,就是我们要的答案。
AC
class Solution():
def maximalRectangle(self, x):
maxArea = 0
if not x:
return 0
vector = [0]* len(x[0])
for r in x:
for i, c in enumerate(r):
if c == '0':
vector[i]=0
else:
vector[i]+=1
maxArea = max(maxArea, self.largestRectangleArea(vector[:]))
return maxArea
def largestRectangleArea(self, xs):
xs.insert(0,0)
xs.append(0)
stack, maxArea = [], 0
for i, x in enumerate(xs):
if not stack or xs[stack[-1]]<=x:
stack.append(i)
else:
while stack and xs[stack[-1]]>x:
maxArea = max(maxArea, xs[stack[-1]]*(i-stack[-2]-1))
stack.pop()
stack.append(i)
return maxArea
if __name__ == "__main__":
matrix = ["01101", "11010", "01110", "11110", "11111", "00000"]
assert Solution().maximalRectangle(matrix) == 9