最大正方形 · Maximal Square

[抄题]:

在一个二维01矩阵中找到全为1的最大正方形

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

返回 4

 [暴力解法]:

时间分析:

空间分析:i j 中保留一排,用指针数组来优化空间存储

[思维问题]:

[一句话思路]:

棋盘类dp也是用扩展,不过是从右下角开始扩展 最大扩展中的最小值,没见过

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

[一刷]:

  1. 第0列初始化完成时,j 从1 开始。第一次发现初始化会对后续计算结果产生影响
  2. 某点的最大扩展f是收到其右下角三个点的计算得出的最大扩展f共同制约的,要看图理解

[二刷]:

[三刷]:

[四刷]:

[五刷]:

  [五分钟肉眼debug的结果]:

[总结]:

i or j中的一个只有2种状态,所以可以mod2 

[复杂度]:Time complexity: O(n) Space complexity: O(1)

[英文数据结构或算法,为什么不用别的数据结构或算法]:

格子类dp 属于坐标型

[关键模板化代码]:

f[i % 2][0] = matrix[i][0];
只有状态数组f要mod2

[其他解法]:

[Follow Up]:

空间优化

[LC给出的题目变变变]:

85. Maximal Rectangle 还是dp但是图形分析更复杂

 [代码风格] :

public int maximalSquare(char[][] matrix) {
        //state 
        //corner case
        int n = matrix.length;
        int m = matrix[0].length;
        int[][] f = new int[2][m];
        int ans = 0;
        if (n == 0) {
            return 0;
        }

        //initialize for i = 0, j >= 1
        for (int i = 0; i < n; i++) {
            if (matrix[i][0] == '1')
            {f[i % 2][0] = 1;
            ans = Math.max(f[i % 2][0], ans);}
            for (int j = 1; j < m; j++) {
                //if row is not 0
                if (i > 0) {
                    //if matrix[i][j] exists
                    if (matrix[i][j] == '1') {
                        //+1
                        f[i % 2][j] = 1 + Math.min(f[(i - 1) % 2][j],Math.min(f[i % 2][j - 1], f[(i - 1) % 2][j - 1]));
                    }
                    else {
                        f[i % 2][j] = 0;
                    }
                }else {
                    //if row is 0
                    if (matrix[i][0] == '1')
                    f[i % 2][j] = 1;
                }
                ans = Math.max(f[i % 2][j], ans);
            }
        }
        //result
        return ans * ans;
View Code
原文地址:https://www.cnblogs.com/immiao0319/p/8514698.html