最大正方形
最大正方形
http://www.nowcoder.com/questionTerminal/0058c4092cec44c2975e38223f10470e
解题思路:根据提示,采用动态规划的方法求解。观察规律,除了单个元素的正方形,其余常规的正方形判断如下,
1 1
1 1
这是一个正方形,是因为arr[i-1][j-1],arr[i-1][j],arr[i][j-1],arr[i][j]的元素相同
增加问题规模,继续观察,
1 1 1
1 1 1
1 1 1
这是一个边长为3的正方形,同时包含四个边长为2的正方形
因此考虑当arr[i-1][j-1],arr[i-1][j],arr[i][j-1],arr[i][j]的元素相同时,将最右下角的元素表示为正方形的最大边长,即
1 1 1
1 2 2
1 2 3
最后输出边长最大的正方形面积
import java.util.*; public class Solution { /** * 最大正方形 * @param matrix char字符型二维数组 * @return int整型 */ public int solve (char[][] matrix) { // write code here int m=matrix.length; int n=matrix[0].length; int[][] dp=new int[m][n]; int max=0; for(int i=0;i<m;i++){ dp[i][0]=matrix[i][0]-'0'; } for(int i=0;i<n;i++){ dp[0][i]=matrix[0][i]-'0'; } for(int i=1;i<m;i++){ for(int j=1;j<n;j++){ if(matrix[i][j]=='1'){ dp[i][j]=Math.min(dp[i-1][j-1],dp[i-1][j]); dp[i][j]=Math.min(dp[i][j],dp[i][j-1])+1; max=Math.max(max,dp[i][j]); } } } return max*max; } }