class Solution {
public int maximalSquare(char[][] matrix) {
//动态规划:dp[i][j]表示:以i,j为右下角的正方向的边长
int[][] dp = new int[matrix.length][matrix[0].length];
int res = 0;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] == '1'){
if (i == 0 || j == 0){
dp[i][j] = 1;
res = Math.max(res, dp[i][j]);
}else {
int min = Math.min(dp[i - 1][j], dp[i][j - 1]);
min = Math.min(min, dp[i - 1][j - 1]);
dp[i][j] = min + 1;
res = Math.max(res, dp[i][j]);
}
}
}
}
return res * res;
}
// public int maximalSquare(char[][] matrix) {
// //我的做法,寻找1,然后统计最大面积
// int max = 0;
// for (int i = 0; i < matrix.length; i++) {
// for (int j = 0; j < matrix[0].length; j++) {
// if (matrix[i][j] == '1'){
// //扩张
// max = Math.max(max,bfs(matrix,i,j));
// }
// }
// }
// return max * max;
// }
// int[][] dir = new int[][]{
// {0,1},{1,0},{1,1}
// };
// public int bfs(char[][] matrix,int x,int y){
// Queue<int[]> queue = new LinkedList<>();
// queue.add(new int[]{x,y});
// int res = 0;
// boolean falg = true;
// boolean[][] vis = new boolean[matrix.length][matrix[0].length];
// vis[x][y] = true;
// while (!queue.isEmpty()){
// int size = queue.size();
// res++;
// for (int i = 0; i < size; i++) {
// int[] poll = queue.poll();
// for (int j = 0; j < 3; j++) {
// int newx = poll[0] + dir[j][0];
// int newy = poll[1] + dir[j][1];
// if (newx >=0 && newx < matrix.length && newy >= 0 && newy < matrix[0].length && matrix[newx][newy] == '1'){
// if (!vis[newx][newy]) {
// queue.offer(new int[]{newx, newy});
// vis[newx][newy] = true;
// }
// }else {
// falg = false;
// break;
// }
// }
// if (!falg){
// break;
// }
// }
// if (!falg) break;
// }
// return res;
// }
}