最大正方形

在一个二维01矩阵中找到全为1的最大正方形
您在真实的面试中是否遇到过这个题?
Yes
样例
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
返回 4
题目地址

解题思路

动态规划的办法,我们可以先求出正方形最大的边长,我们推导出的公式是,原来的数组是arr[][];
f[][]是存储结果的表,当最大正方形包括arr[i][j]的时候,f[i][j] = min(f[i-1][j-1],f[i][j-1],f[i-1][j])+1;当不包含f[i][j]的时候,f[i][j] =0;此时 最大的边长为num = max(f[i][j],num)

完整代码如下:

public class Solution {
   /*
    * @param matrix: a matrix of 0 and 1
    * @return: an integer
    */
   public int maxSquare(int[][] arr) {
       // write your code here
       
       int n = arr.length;
       int m = arr[0].length;
       int num = 0;
       int[][] f = new int[n+1][m+1];
       if (n<=0||m<=0){
           return num*num;
       }
       //初始化f数组
       for (int i = 0;i<n;i++){
           f[i][0] = arr[i][0];
           num = Math.max(f[i][0],num);
       }
       for (int j = 0; j<m;j++){
           f[0][j] = arr[0][j];
           num = Math.max(f[0][j],num);
       }
       
       for (int i = 1;i<n;i++){
           for (int j = 1;j<m;j++){
               if (arr[i][j]==1)
                   f[i][j] = Math.min(Math.min(f[i-1][j-1],f[i][j-1]),f[i-1][j])+1;
               else
                   f[i][j] = 0;
               num = Math.max(f[i][j],num);
           }
       }
       return num*num;
   }
}
    原文作者:Taoyongpan
    原文地址: https://www.jianshu.com/p/1db758f12d30
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞