在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。
对于我这种新手来说第一次碰到这种题肯定是不会的, 但还是尝试着写点东西吧,肯定是用暴力解的,写了两个for循环遍历了这个矩阵,当矩阵值为1的时候就开始判断能组成多大的正方形,这个判断我就不会写了,我想的是先拿到可能的最大值,也就是min(矩阵总行-当前行,矩阵总列-当前列),然后用for循环从1到这个最大值,不符合就可以停止,但这个判断自己确实不会写,就直接看了答案,先是答案的暴力解
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) {
return 0;
}
int maxSide = 0;
int rows = matrix.size(), columns = matrix[0].size();
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
if (matrix[i][j] == '1') {
// 遇到一个 1 作为正方形的左上角
maxSide = max(maxSide, 1);
// 计算可能的最大正方形边长
int currentMaxSide = min(rows - i, columns - j);
for (int k = 1; k < currentMaxSide; k++) {
// 判断新增的一行一列是否均为 1
bool 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 = max(maxSide, k + 1);
} else {
break;
}
}
}
}
}
int maxSquare = maxSide * maxSide;
return maxSquare;
}
};
看完我才知道,最大面积+1,只需要判断加的那一行一列就行,而我因为算法思想不成熟,错误以为要判断全部,后来又学习了动态规划,画了个图就理解了