美文网首页工作生活
LeetCode.221 最大正方形

LeetCode.221 最大正方形

作者: 风卷晨沙 | 来源:发表于2019-07-03 10:42 被阅读0次

    1、题目

    最大正方形 - 力扣(LeetCode) https://leetcode-cn.com/problems/maximal-square/

    2、题解

    这道题目可以使用动态规划的思想,也就是将原问题拆解成子问题,再分治的想法。
    在此题中,其实就是把计算在整个数组中最大的正方形的这个问题,拆解成两个小的问题,一是储存以该点为右下角的正方形的边长大小,二是比较这个数组中储存的值的大小。这样就可以得到最终的结果。
    解释一下,为什么是以该点为右下角的正方形的边长大小

    当我们判断以某个点为正方形右下角时最大的正方形时,那它的上方,左方和左上方三个点也一定是某个正方形的右下角,否则该点为右下角的正方形最大就是它自己了。那具体的最大正方形边长呢?我们知道,该点为右下角的正方形的最大边长,最多比它的上方,左方和左上方为右下角的正方形的边长多1,此时有两种情况,一是它的上方,左方和左上方为右下角的正方形的大小都一样的,这样加上该点(即上三点某一个正方形的边长加1)就可以构成一个更大的正方形。二它的上方,左方和左上方为右下角的正方形的大小不一样,合起来就会缺了某个角落,这时候只能取那三个正方形中最小的正方形的边长加1了。


    最后,分享一下了解动态规划的文章?

    动态规划算法入门,这就够了 https://baijiahao.baidu.com/s?id=1631319141857419948&wfr=spider&for=pc

    3、代码

         //1、动态规划
        class Solution {
            public int maximalSquare(char[][] matrix) {
                //排除异常情况
                if(matrix.length==0||matrix[0].length==0){
                    return 0;
                }
                int result=0;
                int rows = matrix.length;
                int columns = matrix[0].length;
                int[][] dp = new int[rows][columns];//用dp来保存结果
                for (int i = 0; i < rows; i++) {
                    if(matrix[i][0]=='1'){
                        dp[i][0]=1;
                        result=1;
                    }
                }
                for (int j = 0; j < columns; j++) {
                    if (matrix[0][j]=='1'){
                        dp[0][j]=1;
                        result=1;
                    }
                }
                for (int i = 1; i < rows; i++) {
                    for (int j = 1; j < columns; j++) {
                        if(matrix[i][j]=='1'){
                            dp[i][j] = getMin(dp[i][j - 1], dp[i - 1][j - 1], dp[i - 1][j])+1;
                            result=getMax(result,dp[i][j]);
                        }
    
                    }
                }
                return result*result;
            }
            //得到最小整数值
            private int getMin(int... values){
                int minValue = Integer.MAX_VALUE;
                for (int value:values){
                    if(value<minValue){
                        minValue=value;
                    }
                }
                return minValue;
            };
            //得到最大整数值
            private int getMax(int... values){
                int maxValue = Integer.MIN_VALUE;
                for (int value:values){
                    if(value>maxValue){
                        maxValue=value;
                    }
                }
                return maxValue;
            }
    
    
        }
    

    4、执行结果

    image.png

    相关文章

      网友评论

        本文标题:LeetCode.221 最大正方形

        本文链接:https://www.haomeiwen.com/subject/ldegcctx.html