/**
LeetCode 221.最大正方形
形成2*2的小正方形,基础上
[
[a, b]
[c, d(?)]
]
若b >= a && c >= a说明d所在的一个正方形可以在a的基础上,扩充一行一列,变为长宽为a+1的正方形
否则d为Min(b, c)的最小值为长宽的正方形,增加一行一列,变为长宽为Min(b, a)+1的正方形
*/
func maximalSquare(matrix [][]byte) int {
rowLen := len(matrix)
ans := 0
if rowLen == 0 {
return ans
}
dp := make([][500]int, rowLen+1)
for i:=0; i<rowLen; i++ {
colLen := len(matrix[i])
for j:=0; j<colLen; j++ {
if matrix[i][j] == '1' {
//初始化
dp[i][j] = 1
//是否可以形成2*2的小正方形
if j-1 >= 0 && i-1 >= 0 && matrix[i][j-1] == '1' && matrix[i-1][j-1] == '1' && matrix[i-1][j] == '1' {
/**
[
[a, b]
[c, d(?)]
]
若b >= a && c >= a说明d所在的一个正方形可以在a的基础上,扩充一行一列,变为长宽为a+1的正方形
否则d为Min(b, c)的最小值为长宽的正方形,增加一行一列,变为长宽为Min(b, a)+1的正方形
*/
if dp[i-1][j-1] <= dp[i][j-1] && dp[i-1][j-1] <= dp[i-1][j]{
dp[i][j] = dp[i-1][j-1] + 1
} else {
dp[i][j] = Min(dp[i][j-1], dp[i-1][j]) + 1
}
}
ans = Max(ans, dp[i][j] * dp[i][j])
}
}
}
return ans
}
func Max(i, j int) int {
if i > j {
return i
}
return j
}
func Min(i, j int) int {
if i > j {
return j
}
return i
}