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