Skip to content

Code:

js
/**
 * @param {character[][]} matrix
 * @return {number}
 */


// 爆搜
var maximalSquare = function(matrix) {
    const m = matrix.length    
    const n = matrix[m - 1].length
    const dp = new Array(m + 1).fill().map(() => Array(n + 1).fill(0))

    dp[1][1] = Number(matrix[0][0])

    for (let i = 1; i < m; i++) {
        dp[i + 1][1] = Number(matrix[i][0]) + dp[i][1]
    }

    for (let j = 1; j < n; j++) {
        dp[1][j + 1] = Number(matrix[0][j]) + dp[1][j]  
    }

    for (let i = 1; i < m; i++) {
        for (let j = 1; j < n; j++) {
            dp[i + 1][j + 1] = Number(matrix[i][j]) + dp[i][j + 1] + dp[i + 1][j] - dp[i][j]
        }
    }

    let length = Math.min(m, n)

    while(length--) {
        let i = m - 1
        let count = 0

        while(i >= length) {
            let j = n - 1

            while(j >= length) {
                count = dp[i + 1][j + 1] - dp[i - length][j + 1] - dp[i + 1][j - length] + dp[i - length][j - length]
                if (((length + 1) * (length + 1)) === count) {
                    return count
                }
                j--
            }

            i--
        }
    }


    return 0
};


// dp
var maximalSquare = function(matrix) {
    const m = matrix.length    
    const n = matrix[m - 1].length
    const dp = matrix
    let max = 0

    for (let i = 0; i < m; i++) {
        for (let j = 0; j < n; j++) {
            if (matrix[i][j] === '1') {
                dp[i][j] = i === 0 || j === 0 ? 1 : Math.min(dp[i][j - 1], dp[i - 1][j] , dp[i - 1][j - 1]) + 1
            }

            max = Math.max(dp[i][j], max)
        }
    }

    return max * max
}



console.time(1)
console.log(maximalSquare([["0","0","0","0","0"],["1","0","0","0","0"],["0","0","0","0","0"],["0","0","0","0","0"]]))
console.timeEnd(1)

❤ With Algorithm