在一个由0和1组成的二维矩阵内,寻找只包含1的最大正方形,并返回其面积。
例如,给出如下矩阵:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
返回 4.
致谢:
特别感谢 @Freezen 添加该问题并提供所有测试用例。
解题思路——
https://blog.csdn.net/nk_test/article/details/48901853
这个博客讲的很到位了。总的思路就是,如果当前点是最大正方形的右下角,那么它的上,左,左上的三个点也必然是正方形的右下角。
比如:
111
111
111
仔细看,这个3*3的正方形的右下角的1。
这个1的左上角是1,他是2*2的正方形的右下角,同理,3*3的正方形的右下角的1的左和上的1也是2*2正方形的右下角。
在看这个
101
011
111
我们把dp的矩阵写出来,就是
1 0 1
0
1
然后继续
1 0 1
0 1
1
然后继续
1 0 1
0 1 1
1
然后继续
1 0 1
0 1 1
1 1
然后继续
1 0 1
0 1 1
1 1 2
最后结果res=2,返回值为4
AC代码如下——
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if (matrix.empty() || matrix[0].empty()) return 0;
int row = matrix.size(),col = matrix[0].size();
int res = 0;
vector<vector<int>> dp(row,vector<int>(col,0));
for(int i=0;i<row;i++)
if(matrix[i][0]=='1')
dp[i][0] = 1,res =1;//先把最外圈的第一行的值弄好
for(int i=0;i<col;i++)
if(matrix[0][i]=='1')
dp[0][i] = 1,res=1;//再把最外圈的第一列的值弄好
for(int i=1;i<row;i++)
for(int j=1;j<col;j++)
{
if(matrix[i][j] == '1')
dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;
res = max(res,dp[i][j]);
}
return res*res;
}
};