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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值