最大正方形

问题描述

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

示例:

输入: 

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;
   }
}



 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值