大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。
“在0和1组成的矩阵中找到只包含1的最大正方形,返回其面积。”
题目链接:
来源:力扣(LeetCode)
在一个由 '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
题意要在0和1组成的二维矩阵中找到只包含1的最大正方形,返回其面积。
由于正方形的面积等于边长的平方,因此要找到最大的正方形的面积,就需要找到最大正方形的边长,然后计算最大边长的平方即可。
具体的,就是遍历矩阵中的每个元素,遇到1,则将钙元素作为正方形的左上角。
确定左上角后,根据左上角的行和列计算可能的正方形的边长,在行数和列数的范围内找出只包含1的最大正方形。
每次右或下新增一行,判断新增的行和列是否满足所有元素都是1。
代码参考:
class Solution {
public int maximalSquare(char[][] matrix) {
int maxSide = 0;
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return maxSide;
}
int rows = matrix.length, columns = matrix[0].length;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
if (matrix[i][j] == '1') {
// 遇到一个 1 作为正方形的左上角
maxSide = Math.max(maxSide, 1);
// 计算可能的最大正方形边长
int currentMaxSide = Math.min(rows - i, columns - j);
for (int k = 1; k < currentMaxSide; k++) {
// 判断新增的一行一列是否均为 1
boolean flag = true;
if (matrix[i + k][j + k] == '0') {
break;
}
for (int m = 0; m < k; m++) {
if (matrix[i + k][j + m] == '0' || matrix[i + m][j + k] == '0') {
flag = false;
break;
}
}
if (flag) {
maxSide = Math.max(maxSide, k + 1);
} else {
break;
}
}
}
}
}
int maxSquare = maxSide * maxSide;
return maxSquare;
}
}
时间复杂度:O(mn min(m,n)2)
其中m和n是矩阵的行数和列数。
空间复杂度:O(1)
只需要常数级的变量空间。
遍历整个矩阵寻找每个1,所需要的时间复杂度为O(mn)。
对于每个可能的正方形的边长都不会超过行数和列数,因此遍历该正方形的每个元素,并且判断是不是只包含1的时间复杂度为O(min(m,n)2)。