您的位置:首页 > Web前端 > JavaScript

[LeetCode][JavaScript]Maximal Square

2016-02-28 21:23 736 查看

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.
https://leetcode.com/problems/maximal-square/

找出地图中最大的一个由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的时候返回平方数。

/**
* @param {character[][]} matrix
* @return {number}
*/
var maximalSquare = function(matrix) {
if(matrix.length === 0) return 0;
var max = 0, i, j, dp = [],
height = matrix.length, width = matrix[0].length;
for(i = 0; i < height; i++)
dp[i] = [];
for(i = 0; i < height; i++){
for(j = 0; j < width; j++){
if(matrix[i][j] === '1'){
dp[i][j] = getSquare(i, j);
max = Math.max(max, dp[i][j]);
}
}
}
return max * max;

function getSquare(i, j){
if(!matrix[i - 1] || !matrix[i - 1][j - 1])
return 1;
var index, width = dp[i - 1][j - 1];
if(!width) return 1;
for(index = 1; index <= width; index++)
if(!matrix[i - index] || matrix[i - index][j] !== '1'
|| matrix[i][j - index] !== '1')
return index;
return width + 1;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: