描述
给定一个由 ‘0’ 和 ‘1’ 组成的2维矩阵,返回该矩阵中最大的由 ‘1’ 组成的正方形的面积。输入的矩阵是字符形式而非数字形式。
数据范围:矩阵的长宽满足 0≤n≤20,矩阵中的元素属于 {‘1’,‘0’}
进阶:空间复杂度 O(n^2)
, 时间复杂度 O(n^2)
示例1
输入:[[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]]
返回值:4
示例2
输入:[[1,0,0],[0,0,0],[0,0,0]]
返回值:1
动态规划:时间复杂度:O(mn),m,n表示矩阵的行和列
空间复杂度:O(mn)
牛客题解,做的太好看了属于是
import java.util.*;
public class Solution {
/**
* 最大正方形
* @param matrix char字符型二维数组
* @return int整型
*/
public int solve (char[][] matrix) {
//二维矩阵的宽和高
if(matrix.length == 0) return 0;
int height = matrix.length;
int width = matrix[0].length;
int[][] dp = new int[height + 1][width + 1];
int maxSide = 0;//最大正方形的宽
for (int i = 1; i <= height; i++) {
for (int j = 1; j <= width; j++) {
if (matrix[i - 1][j - 1] == '1') {
//递推公式
dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i - 1][j - 1], dp[i][j - 1])) + 1;
//记录最大的边长
maxSide = Math.max(maxSide, dp[i][j]);
}
}
}
//返回正方形的面积
return maxSide * maxSide;
}
}