class Solution {
public int[] findSquare(int[][] matrix) {
int [] res = new int [0];
int [][][] dp = new int [2][matrix.length+1][matrix[0].length+1];
int max = 0
for(int i=1;i<=matrix.length;i++){
for(int j=1;j<=matrix[0].length;j++){
if(matrix[i-1][j-1]==0){
dp[0][i][j] = dp[0][i-1][j]+1;
dp[1][i][j] = dp[1][i][j-1]+1;
int bound = Math.min(dp[0][i][j], dp[1][i][j]);
for(int k=0;k<bound;k++){
if(dp[1][i-k][j]>=k+1&&dp[0][i][j-k]>=k+1){
if(k+1>max){
res = new int [3];
max = k+1;
res[0] = i-k-1;
res[1] = j-k-1;
res[2] = max;
}
}
}
}
}
}
return res;
}
}
class Solution:
def findSquare(self, matrix: List[List[int]]) -> List[int]:
n = len(matrix)
dp = [[[0, 0] for _ in range(n + 1)] for _ in range(n + 1)]
ans = []
for i in range(1, n + 1):
for j in range(1, n + 1):
if matrix[i - 1][j - 1] == 0:
dp[i][j][0] = dp[i-1][j][0] + 1
dp[i][j][1] = dp[i][j-1][1] + 1
upper = min(dp[i][j][0], dp[i][j][1])
for k in range(upper):
if min(dp[i-k][j][1], dp[i][j-k][0]) >= k + 1:
if not ans or k + 1 > ans[2]:
ans = [i-k-1, j-k-1, k + 1]
return ans