https://leetcode.com/problems/maximal-rectangle/
还可以结合https://leetcode.com/problems/maximal-square/一起看
这里思路很重要,是重点。
就是把每一行转化成上一题求histogram最大矩形的题目来做。这里每一个行的,每一个元素的直方图就是往上数**连续**1的个数。求连续1可以先求一次,存入到ones数组里面,再scan的时候fetch就行。也可以像下面的code一样,每求一次用一次。
思路参考:http://www.cnblogs.com/lichen782/p/leetcode_maximal_rectangle.html
http://www.cnblogs.com/lichen782/p/leetcode_maximal_rectangle.html
code参考http://www.cnblogs.com/zuoyuan/p/3784252.html
class Solution(object):
def largestRectangleArea(self, height):
stack=[]; i=0; area=0
while i<len(height):
if stack==[] or height[i]>height[stack[len(stack)-1]]:
stack.append(i)
else:
curr=stack.pop()
width=i if stack==[] else i-stack[len(stack)-1]-1
area=max(area,width*height[curr])
i-=1
i+=1
while stack!=[]:
curr=stack.pop()
width=i if stack==[] else len(height)-stack[len(stack)-1]-1
area=max(area,width*height[curr])
return area
def maximalRectangle(self, matrix):
if matrix==[]: return 0#这里要判断是否为[]
a=[0 for i in range(len(matrix[0]))]; maxArea=0
for i in range(len(matrix)):
for j in range(len(matrix[i])):
a[j]=a[j]+1 if matrix[i][j]=='1' else 0#这里要注意这种求连续1的trick办法.注意这里是字符的1
maxArea=max(maxArea, self.largestRectangleArea(a))
return maxArea