• LintCode刷题——最大正方形


    题目描述:

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

    样例:
    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0
    

    返回 4;

    算法分析:

    对于给定矩阵matrix[][],可以建立对应的矩阵DP[][],用DP[i][j]来记录以点i,j为右下角的全1矩阵的最大边长。同时经过分析可以得出,DP[i][j]的值与DP[i-1][j],DP[i][j-1],DP[i-1][j-1]这三者的值有关:

      ①若DP[i-1][j],DP[i][j-1],DP[i-1][j-1]三者中存在0值,则DP[i][j]一定为0;

      ②若DP[i-1][j],DP[i][j-1],DP[i-1][j-1]均不为0,则DP[i][j]为三者中的最小值+1,因为三者中的最小值一定为三者所共有的不含0的部分,否则会造成缺角;

    因此对于某一点(i,j), 若matrix[i][j]=1,则动态规划表达式为DP[i][j] = min{DP[i-1][j],DP[i][j-1],DP[i-1][j-1]} + 1;

    代码:

    public class Solution {
        /*
         * @param matrix: a matrix of 0 and 1
         * @return: an integer
         */
        public int maxSquare(int[][] matrix) {
            // write your code here
            if(matrix==null){
                return 0;
            }
            int m = matrix.length;
            int n = matrix[0].length;
            int res = 0;
            int[][] result = new int[m][n];
            //矩阵初始化
            for(int i=0;i<m;i++){
                result[i][0] = matrix[i][0];
                res = Math.max(matrix[i][0],res);
            }
            for(int j=0;j<n;j++){
                result[0][j] = matrix[0][j];
                res = Math.max(matrix[0][j],res);
            }
            for(int i=1;i<m;i++){
                for(int j=1;j<n;j++){
                    if(matrix[i][j]==1){
                        result[i][j] = Math.min(result[i-1][j],Math.min(result[i][j-1],result[i-1][j-1]))+1;
                    }
                    res = Math.max(res,result[i][j]);
                }
            }
            return res*res;
        }
    }    
  • 相关阅读:
    codevs1076 排序
    codevs1075 明明的随机数
    codevs1205 单词翻转
    codevs1204 寻找子串位置
    codevs2235 机票打折
    codevs1206 保留两位小数
    codevs1203 判断浮点数是否相等
    codevs1202 求和
    codevs1201 最小数和最大数
    Static Sushi AtCoder
  • 原文地址:https://www.cnblogs.com/Revenent-Blog/p/7587654.html
Copyright © 2020-2023  润新知