class Solution(object):
def _largestArea(self, sortHeight, ind, heights, left, right):
if right<=left:
return 0
if right-left<=1:
return heights[left]*(right-left)
while ind<len(sortHeight) and not left<=sortHeight[ind][0]<right:
ind+=1
if ind>=len(sortHeight):
return 0
return max((right-left)*sortHeight[ind][1],
self._largestArea(sortHeight, ind+1, heights, left, sortHeight[ind][0]),
self._largestArea(sortHeight, ind+1, heights, sortHeight[ind][0]+1, right)
)
def largestRectangleArea(self, heights):
"""
:type heights: List[int]
:rtype: int
"""
sortHeights = sorted([v for v in enumerate(heights)], key=lambda x:x[1])
return self._largestArea(sortHeights, 0, heights, 0, len(sortHeights))
def maximalRectangle(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
maxx=[]
for j, line in enumerate(matrix):
maxx.append([])
for i, v in enumerate(line):
if i>=len(maxx):
maxx.append([])
if v == "1":
if i>0:
maxx[i].append(maxx[i-1][j]+1)
else:
maxx[i].append(1)
else:
maxx[i].append(0)
maxarea = 0
for heights in maxx:
maxarea=max(maxarea, self.largestRectangleArea(heights))
return maxarea