问题描述:
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
执行结果:
代码描述:
思路:先用最大的正方形去扫整个区域,如果没有,则对移动的正方形边长-1,然后继续扫描全局,直到找到。
最左侧大蓝框,一个格子一个格子的匹配,然后下一行继续匹配,直到最后。如果这个范围没有,则依次缩小,比如到土黄色框,然后继续扫描,直到找到或者退出。 由于是找最大的面积,所以格子从最大的开始。图像处理的原理。
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0)
return 0;
if(matrix.size() == 1)
{
for(int i = 0; i < matrix[0].size(); ++i)
if(matrix[0][i] == '1')
return 1;
return 0;
}
int heigh = matrix.size(); //高,i 的最大值
int width = matrix[0].size(); // 宽, j的最大值
int maxLen = max(heigh, width)-1; // -1 是因为索引从0开始
while(maxLen >= 0)
{
for(int i = 0; i + maxLen < heigh; ++i) // 注意边界
{
for(int j = 0; j + maxLen < width; ++j) // 注意边界
{
if(isMatrix(matrix, i, i+maxLen, j, j+maxLen) == true)
{
if(maxLen == 0)
return 1;
return (maxLen+1)*(maxLen+1);
}
}
}
--maxLen;
}
return 0;
}
bool isMatrix(vector<vector<char>>& matrix, int is, int ie, int js, int je)
{
for(int i = is; i <= ie; ++i)
{
for(int j = js; j <= je; ++j)
{
if(matrix[i][j] == '0')
return false;
}
}
return true;
}
};