提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、题目
二、代码
1.dfs
代码如下:
class Solution {
public:
int maximalSquare(vector<vector<char>>& a) {
int n = a.size(),m = a[0].size();
if(n == 0 || m == 0) return 0;
int maxside = 0;
for(int i = 0;i < n;i ++)
for(int j = 0;j < m;j ++)
{
if(a[i][j] == '1')
{
maxside = max(maxside,1);
int cmaxside = min(n - i,m - j);
for(int k = 1;k < cmaxside;k ++)
{
bool flag = true;
if(a[i + k][j + k] == '0') break;
for(int q = 0;q < k;q ++)
{
if(a[i + k][j + q] == '0' || a[i + q][j + k] == '0')
{
flag = false;
break;
}
}
if(flag) maxside = max(maxside,1 + k);
else
{
break;
}
}
}
}
return maxside * maxside;
}
};
解题思路:遍历二维数组中的每个数,每次遇到 1,则将其作为正方形的左上角。确定正方形的左上角后,根据坐标确定下可以形成的最大正方形边长,每次在下方新增一行以及在右方新增一列,判断新增的行和列是否满足所有元素都是 1。(75/78)(数据过不全)
2.dp
代码如下:
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) {
return 0;
}
int maxS = 0;
int n = matrix.size(), m = matrix[0].size();
int dp[310][310] = {0};
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (matrix[i][j] == '1') {
if (i == 0 || j == 0) {
dp[i][j] = 1;
} else {
dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
}
maxS = max(maxS, dp[i][j]);
}
}
}
return maxS * maxS;
}
};
解题思路:
如果i , j 位置的值是 0,则 dp[i, j] = 0
如果i , j 位置的值是 1,则 dp[i, j]的值由其上方、左方和左上方三个位置的值决定。
公式:dp[i,j]=min(dp[i−1,j−1],dp[i−1,j],dp[i,j−1])+1
原来图像:
dp后的图像: