[LeetCode][JavaScript]Maximal Square

Maximal Square

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.

For example, given the following matrix:

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Return 4.
 
 
 

 
 
 
找出地图中最大的一个由1组成的正方形。
 
动态规划,大的正方型是由小的正方形加上两条边组成的。
遍历二维数组,第一次遇到1的时候,dp数组的对应位置也记做1.
再遇到1的时候,查看这个点的左上角(dp[i - 1][j - 1])是不是存在,以及检查上边和左边是否全部是1。
 
举例来说:
1 1
1 1
遍历到右下的点(坐标[1][1])。
发现左上角是1,又知道当前点的左边和上面也是1,说明构成了2X2的正方形,把当前点在dp数组中记做2。
 
复杂点的情况比如:
1 1 0
1 1 1
1 1 1
坐标为[0][0]的点在dp中记做1,坐标为[1][1]的点记做2,没有问题。
当遍历到[3][3]时,因为[0][2]是0,所以[3][3]在dp中只能记做2。
 
最后,因为dp中记录的是矩形的宽度,return的时候返回平方数。
 
 1 /**
 2  * @param {character[][]} matrix
 3  * @return {number}
 4  */
 5 var maximalSquare = function(matrix) {
 6     if(matrix.length === 0) return 0;
 7     var max = 0, i, j, dp = [],
 8         height = matrix.length, width = matrix[0].length;
 9     for(i = 0; i < height; i++)
10         dp[i] = [];
11     for(i = 0; i < height; i++){
12         for(j = 0; j < width; j++){
13             if(matrix[i][j] === '1'){
14                 dp[i][j] = getSquare(i, j);
15                 max = Math.max(max, dp[i][j]);
16             }
17         }
18     }
19     return max * max;
20 
21     function getSquare(i, j){
22         if(!matrix[i - 1] || !matrix[i - 1][j - 1])
23             return 1;
24         var index, width = dp[i - 1][j - 1];
25         if(!width) return 1;
26         for(index = 1; index <= width; index++)
27             if(!matrix[i - index] || matrix[i - index][j] !== '1'
28                 || matrix[i][j - index] !== '1')
29                 return index;
30         return width + 1;
31     }
32 };
原文地址:https://www.cnblogs.com/Liok3187/p/5225665.html