工作生活

LeetCode.221 最大正方形

2019-07-03  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读