lc 85. Maximal Rectangle

错误思路:二分去找最大正方形a*a,拿着最大正方形的边长a去找最大矩形a*x。问题是有了最大正方形a*a,最大的矩形也可能边长里面没有a,可能是一个很狭长的长方形。尤其在1密集的矩形中。最近做了几个二分的题目,二分思想真的强大,优化问题转判断问题。

 

01矩阵的最大矩形相关的问题还是很多的。

为什么自己想不出解题思路来?too stupid to live

对于当前的一行来说,我们假设要求所有以当前行为下边的矩形。

那么我们怎么求呢?如果有一个当前行的每一个元素上方的1的连续数量不就变成了https://leetcode.com/problems/largest-rectangle-in-histogram/这个问题了吗。

所以最终n^2复杂度。给跪了。

说说下面代码的骚操作来学习一下:

1.   height = [0] * (n + 1) 然后一直保留最后的那个0,当他进栈的时候会踢出每一个栈中的元素(当有0?有0的话意味着是唯一的0,踢不踢都一样了)。

2.  stack = [-1] 保证不用空判断。

3.  当我们保证了每一个元素都会进栈的时候!!!我们又用最后的0保证了每一个元素都会出栈!!!

4.  每个元素出栈的时候会去计算以它为最低点的矩形长度。简直完美逻辑,代码一行不多的。

def maximalRectangle(self, matrix):
    if not matrix or not matrix[0]:
        return 0
    n = len(matrix[0])
    height = [0] * (n + 1)
    ans = 0
    for row in matrix:
        for i in xrange(n):
            height[i] = height[i] + 1 if row[i] == '1' else 0
        stack = [-1]
        for i in xrange(n + 1):
            while height[i] < height[stack[-1]]:
                h = height[stack.pop()]
                w = i - 1 - stack[-1]
                ans = max(ans, h * w)
            stack.append(i)
    return ans

 

posted @ 2019-04-03 16:00  Cloud.9  阅读(140)  评论(0编辑  收藏  举报