436. 最大正方形

Posted yunxintryyoubest

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了436. 最大正方形相关的知识,希望对你有一定的参考价值。

436. 最大正方形

中文English

在一个二维01矩阵中找到全为1的最大正方形, 返回它的面积.

样例

样例 1:

输入:
[
  [1, 0, 1, 0, 0],
  [1, 0, 1, 1, 1],
  [1, 1, 1, 1, 1],
  [1, 0, 0, 1, 0]
]
输出: 4

样例 2:

输入: 
[
  [0, 0, 0],
  [1, 1, 1]
]
输出: 1
 
 
输入测试数据 (每行一个参数)如何理解测试数据?

 动态规划 + 滚动数组

class Solution:
    """
    @param matrix: a matrix of 0 and 1
    @return: an integer
    """
    def maxSquare(self, matrix):
        # write your code here
        #经典的dp问题
        if not matrix: return 0
        
        #以当前点作为正方形的右下角,然后计算正方形的边长,滚动数组
        len_x, len_y = len(matrix), len(matrix[0])
        dp = [[0 for _ in range(len_y)], [0 for _ in range(len_y)]]
        result = 0 
        boder = 0 
        
        #边界情况
        for j in range(len_y):
            dp[0][j] = matrix[0][j]

        if len_x == 1:
            boder = max(matrix[0])
            
        #计算顺序
        for i in range(1, len_x):
            #边界情况
            dp[i%2][0] = matrix[i][0]
            for j in range(1, len_y):
                if (matrix[i][j] == 0):
                    dp[i%2][j] = 0
                    continue
                
                dp[i%2][j] = min(dp[(i - 1)%2][j], dp[i%2][j - 1], dp[(i - 1)%2][j - 1]) + 1
            boder = max(boder, max(dp[i%2]))
        
        return boder*boder

 

以上是关于436. 最大正方形的主要内容,如果未能解决你的问题,请参考以下文章

#436. 子串的最大差(单调栈)

java刷题--221最大正方形

[LeetCode]最大系列(最大正方形221,最大加号标志764)

221最大正方形

[leetcode] 221. 最大正方形

[M前缀和] lc1139. 最大的以 1 为边界的正方形(行列前缀和+代码技巧)