大家好,我是小魔龙,Unity3D软件工程师,VR、AR,虚拟仿真方向,不定时更新软件开发技巧,生活感悟,觉得有用记得一键三连哦。
一、题目
1、算法题目
“在0和1组成的矩阵中找到只包含1的最大正方形,返回其面积。”
2、题目描述
在一个由 '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
二、解题
1、思路分析
题意要在0和1组成的二维矩阵中找到只包含1的最大正方形,返回其面积。
由于正方形的面积等于边长的平方,因此要找到最大的正方形的面积,就需要找到最大正方形的边长,然后计算最大边长的平方即可。
具体的,就是遍历矩阵中的每个元素,遇到1,则将钙元素作为正方形的左上角。
确定左上角后,根据左上角的行和列计算可能的正方形的边长,在行数和列数的范围内找出只包含1的最大正方形。
每次右或下新增一行,判断新增的行和列是否满足所有元素都是1。
2、代码实现
代码参考:
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; } }
3、时间复杂度
时间复杂度:O(mn min(m,n)2)
其中m和n是矩阵的行数和列数。
空间复杂度:O(1)
只需要常数级的变量空间。
三、总结
遍历整个矩阵寻找每个1,所需要的时间复杂度为O(mn)。
对于每个可能的正方形的边长都不会超过行数和列数,因此遍历该正方形的每个元素,并且判断是不是只包含1的时间复杂度为O(min(m,n)2)。