leetcode -- Maximal Rectangle -- 重点

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

你可能感兴趣的:(LeetCode)