每天两道LeetCodeHard:(14)

101 阅读1分钟

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

答案补充: