在一个由 '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
示例 3:
输入:matrix = [["0"]] 输出:0
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j]
为'0'
或'1'
解析:
这道题设定dp数组,dp[i][j]表示 i 行 j 列及其左上角正方形中,题意所求正方形最大的面积是多少
然后通过计算 dp[i][j - 1] 、dp[i - 1][j]、 dp[i - 1][j - 1]三个位置的最小值,代表不计算dp[i][j]时的最大面积,然后开根号加一,计算平方,则为dp[i][j]位置题意所求正方形最大面积。
源码:
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
vector<vector<int>> dp(m, vector<int>(n));
int max_value = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dp[i][j] = matrix[i][j] - 48;
if (dp[i][j] > max_value) {
max_value = dp[i][j];
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cout << dp[i][j] << " ";
}
cout << endl;
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
int min_value = min(dp[i][j - 1], min(dp[i - 1][j], dp[i - 1][j - 1]));
if (dp[i][j] != 0) {
dp[i][j] = (sqrt(min_value) + 1) * (sqrt(min_value) + 1);
}
if (dp[i][j] > max_value) {
max_value = dp[i][j];
}
}
cout << endl;
}
for (int j = 1; j < dp[m - 1].size(); j++) {
max_value = max(max_value, dp[m - 1][j]);
}
return max_value;
}
};