题目
在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。
示例 1:
输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]
输出:4
示例 2:
输入:matrix = [[“0”,“1”],[“1”,“0”]]
输出:1
示例 3:
输入:matrix = [[“0”]]
输出:0
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j] 为 ‘0’ 或 ‘1’
代码
func maximalSquare(matrix [][]byte) int {
// 结果
maxSide := 0
// 声明 DP
dp := make([][]int, len(matrix))
// 初始化 DP
for i := 0; i < len(matrix); i++ {
dp[i] = make([]int, len(matrix[i]))
for j := 0; j < len(matrix[i]); j++ {
// 初始化
dp[i][j] = int(matrix[i][j] - '0')
if dp[i][j] == 1 {
maxSide = 1
}
}
}
// 状态转移
for i := 1; i < len(matrix); i++ {
for j := 1; j < len(matrix[i]); j++ {
if matrix[i][j] == '1' {
// 状态转移方程
dp[i][j] = min(dp[i][j-1], min(dp[i-1][j-1], dp[i-1][j])) + 1
// 更新最大正方形边长
if dp[i][j] > maxSide {
maxSide = dp[i][j]
}
}
}
}
return maxSide * maxSide
}
func min(x, y int) int {
if x < y {
return x
}
return y
}