zoukankan      html  css  js  c++  java
  • 最大正方形 · 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
  • 相关阅读:
    Java中时间方法大全(持续更新)
    Set集合转换为List集合
    Maven配置【详细】
    maven配置环境变量
    idea中创建Java类时,自动在文件头中添加作者和创建时间
    linux下怎样在某个文件里面查找一个字符串?
    执行docker一系列命令失败
    如何在服务器上搭建SVN
    本地拉取服务器上的项目,SVN 由于目标计算机积极拒绝 无法连接失败
    [节选] web项目中使用freemarker [Translated By Nan Lei]
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8514698.html
Copyright © 2011-2022 走看看