Skip to main content

Maximal Square

Problem statement

Given an m x n binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.

Example 1:

Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]Output: 4

Example 2:

Input: matrix = [["0","1"],["1","0"]]Output: 1

Example 3:

Input: matrix = [["0"]]Output: 0

Constraints:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 300
  • matrix[i][j] is '0' or '1'.

My solution

/**
* @param {character[][]} matrix
* @return {number}
*/
var maximalSquare = function(matrix) {
if (!matrix || matrix.length === 0 || matrix[0].length === 0) {
return 0
}

let max = Number.MIN_SAFE_INTEGER;

const memo = Array.from({
length: matrix.length
}, () => Array.from({
length: matrix[0].length
}, () => 0))

for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[i].length; j++)
{
// console.log(matrix[i][j], typeof matrix[i][j])
if (matrix[i][j] === "1") {

const len = getMatrixSize(i, j, memo, matrix)
max = Math.max(max, len ** 2)
}
}
}

return max === Number.MIN_SAFE_INTEGER ? 0 : max;
};

function getMatrixSize(row, col, memo, matrix) {
if (row < 0 || col < 0 || row >= memo.length || (matrix[row] && col >= matrix[row].length) || matrix[row][col] === "0") {
return 0
}

if (memo[row][col]) {
return memo[row][col]
} else {
memo[row][col] = Math.min(
getMatrixSize(row, col + 1, memo, matrix),
getMatrixSize(row + 1, col, memo, matrix),
getMatrixSize(row + 1, col + 1, memo, matrix),
) + 1
}

return memo[row][col]

}