zoukankan      html  css  js  c++  java
  • 最大正方形

    在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。

    输入: 
    
    1 0 1 0 0
    1 0 1 1 1
    1 1 1 1 1
    1 0 0 1 0
    
    输出: 4

    简历一个二维dp数组,其中dp[i][j]表示到达(i, j)位置所能组成的最大正方形的边长。我们首先来考虑边界情况,也就是当i或j为0的情况,那么在首行或者首列中,必定有一个方向长度为1,那么就无法组成长度超过1的正方形,
    最多能组成长度为1的正方形,条件是当前位置为1。边界条件处理完了,再来看一般情况的递推公式怎么办,对于任意一点dp[i][j],由于该点是正方形的右下角,所以该点的右边,下边,右下边都不用考虑,关心的就是左边,上边,
    和左上边。这三个位置的dp值suppose都应该算好的,还有就是要知道一点,只有当前(i, j)位置为1,dp[i][j]才有可能大于0,否则dp[i][j]一定为0。当(i, j)位置为1,此时要看dp[i-1][j-1], dp[i][j-1],和
    dp[i-1][j]这三个位置,我们找其中最小的值,并加上1,就是dp[i][j]的当前值了,这个并不难想,毕竟不能有0存在,所以只能取交集,最后再用dp[i][j]的值来更新结果res的值即可,参见代码如下:
    class Solution {
        
        public int maximalSquare(char[][] matrix) {
            if(matrix.length==0)return 0;
            int[][]dp=new int[matrix.length][matrix[0].length];
            int res=0;
            for(int i=0;i<matrix.length;i++){
                dp[i][0]=matrix[i][0]-'0';
                res=Math.max(res,dp[i][0]);
            }
            for(int j=1;j<matrix[0].length;j++){
                dp[0][j]=matrix[0][j]-'0'; 
                res=Math.max(res,dp[0][j]);
            }        
            for(int i=1;i<matrix.length;i++){
                for(int j=1;j<matrix[i].length;j++){                                
                    if(matrix[i][j]=='0')dp[i][j]=0;
                    else{
                        dp[i][j]=Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1]))+1;
                        
                    }                               
                    res=Math.max(res,dp[i][j]);                   
                    
                }
            }
            return res*res;
        }
    }
  • 相关阅读:
    不可或缺 Windows Native (15)
    不可或缺 Windows Native (14)
    不可或缺 Windows Native (13)
    不可或缺 Windows Native (12)
    不可或缺 Windows Native (11)
    不可或缺 Windows Native (10)
    不可或缺 Windows Native (9)
    不可或缺 Windows Native (8)
    不可或缺 Windows Native (7)
    不可或缺 Windows Native (6)
  • 原文地址:https://www.cnblogs.com/yihangZhou/p/10117749.html
Copyright © 2011-2022 走看看