Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area.
Solutions
I. Solution by finding largest rectangle in histogram
class Solution:
# @param matrix, a list of lists of 1 length string
# @return an integer
def maximalRectangle(self, matrix):
if not matrix:
return 0
h, w = len(matrix), len(matrix[0])
m = [[0]*w for _ in range(h)]
for j in range(h):
for i in range(w):
if matrix[j][i] == '1':
m[j][i] = m[j-1][i] + 1
return max(self.largestRectangleArea(row) for row in m)
def largestRectangleArea(self, height):
'''
This uses the way we calculate maximum rectangle in histogram
'''
height.append(0)
stack, area = [], 0
for i in range(len(height)):
while stack and height[stack[-1]] > height[i]:
h = height[stack.pop()]
w = i if not stack else i-stack[-1]-1
area = max(area, h*w)
stack.append(i)
return area
No comments:
Post a Comment