85. Maximal Rectangle
动态规划矩阵题
题干:
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.
解释:
非常直白的一个题,找到只包含1的最大矩形
思考:
最大一出现,大概率是用dp,这道题也很明显是让我们用dp,避免重复寻找当前最大的面积。我们可以用一个dp来保存以当前位置(i,j)为右下角的矩形对应的最大连续1的长和宽,状态转移方程为:dp[i][j]的长=dp[i][j-1]的长+1,dp[i][j]的高=dp[i-1][j]的高+1,然后寻找最大的面积就行啦。 然而看了答案才知道原来并不是这样做的(泪奔)这个题实际上就是把每一层都当作上一个题的直方图就行,对每一层调用上面的函数然后找最大值即可。 这里show一个大神的二进制解法,实在是有些妙。
答案:
class Solution:
def maximalRectangle(self, matrix: List[List[str]]) -> int:
if not matrix or not matrix[0]:
return 0
nums = [int(''.join(row), base=2) for row in matrix]
ans, N = 0, len(nums)
for i in range(N):
j, num = i, nums[i]
while j < N:
num = num & nums[j]
if not num:
break
l, curnum = 0, num
while curnum:
l += 1
curnum = curnum & (curnum << 1)
ans = max(ans, l * (j-i+1))
j += 1
return ans