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