221. Maximal Square

该题是要算出矩阵中由“1”构成正方形的区域面积。

这个题目一开始想到的方法是遍历整个矩阵,每次遇到“1”, 检测从这个“1”开始是否构成正方形,检测方法是检测现有为“1”的区域的右边和下边的外围是否为“1”, 如果外围都是“1”的话,这些“1”就构成了新的正方形区域,然后继续检测新的区域外围是否都是“1”,用这个形式不断外推。最后获取最大正方形区域的面积。

但是这个方法的时间复杂度还是比较高的。

 

后面使用的是动态规划的方法。建立一个新的与输入矩阵等宽等长的整型数组,每个元素记录元素所处位置左上方构成最大正方形区域的边长,使用的核心代码为:

      dp[i][j] = Math.min(Math.min(dp[i][j-1], dp[i-1][j-1]), dp[i-1][j]) + 1;

 

代码如下:

 

 1 class Solution {
 2     public int maximalSquare(char[][] matrix) {
 3         
 4         int rows = matrix.length, cols = rows > 0 ? matrix[0].length:0;
 5         int[][] dp = new int[rows+1][cols+1];
 6         int maxlen = 0;
 7         
 8         for( int i = 1 ; i <= rows ; i++){
 9             for( int j = 1 ; j <= cols ; j++){
10                 if( matrix[i-1][j-1] == '1'){
11                     dp[i][j] = Math.min(Math.min(dp[i][j-1], dp[i-1][j-1]), dp[i-1][j]) + 1;
12                     maxlen = Math.max(dp[i][j], maxlen);
13                 }
14                
15             }    
16         }
17         
18         return maxlen*maxlen;
19     }
20 }

 

 

END

posted @ 2018-05-15 10:04  sysu_kww  阅读(147)  评论(0编辑  收藏  举报