一、题目描述:
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。示例 1:输入:
代码语言:javascript复制matrix = [
["1","0","1","0","0"],
["1","0","1","1","1"],
["1","1","1","1","1"],
["1","0","0","1","0"]
]
输出:4
示例 2:输入:
代码语言:javascript复制matrix = [
["0","1"],
["1","0"]
]
输出:1
示例 3:输入:
代码语言:javascript复制matrix = [
["0"]
]
输出:0
提示:
代码语言:javascript复制 m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j] 为 '0' 或 '1'
二、思路分析:
2.1 动态规划法分析:
1.如果matrix[i][j]等于0,那么就不用看了,直接等于0。
2.如果matrix[i][j]等于1,那么我们将matrix[[i][j]] 分别往上和往左进行延伸,直到碰到一个0为止。
3.当前数组为1的时候 dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) 1 //判断左上,左下,右上是否有0
三、AC 代码:
javascript解法
代码语言:javascript复制/**
* @param {character[][]} matrix
* @return {number}
*/
var maximalSquare = function (matrix) {
if (!matrix.length || !matrix[0].length) return 0
var maxSlideLen = 0, //记录最长边
dp = Array(matrix.length); //构建dp数组
for (var i = 0; i < matrix.length; i ) {
dp[i] = Array(matrix[0].length).fill(0); //填充每一位为0
for (let j = 0; j < matrix[0].length; j ) {
if (matrix[i][j] === 1) {
if (i === 0 || j === 0) {
dp[i][j] = 1; // 第一列和第一行的dp值为1
} else {
dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) 1 //判断左上,左下,右上是否有0
}
maxSlideLen = Math.max(maxSlideLen, dp[i][j]) //更新最大边长
}
}
}
return maxSlideLen ** 2 //求最大边长面积
};
python解法
代码语言:javascript复制class Solution(object):
def maximalSquare(self, matrix):
"""
:type matrix: List[List[str]]
:rtype: int
"""
if len(matrix)==0 or len(matrix[0])==0:
return 0
maxSlide=0
rows,cols = len(matrix),len(matrix[0])
dp = [[0]*(cols 1) for i in range(rows 1)]
for i in range(1,rows 1):
for j in range(1,cols 1):
if matrix[i-1][j-1] == '1':
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) 1 ## 判断左上,左下,右上是否有0
maxSlide = max(maxSlide, dp[i][j]) ## 更新最大边长
return maxSlide*maxSlide