一个深度优先,最开始错误在想减少时间设置了visit数组,访问的不在访问,但实际是不对的。比如:
[["0","0","0","1"],["1","1","0","1"],["1","1","1","1"],["0","1","1","1"],["0","1","1","1"]]
后来老老实实做时间空间也都很好。
Runtime: 20 ms, faster than 97.16% of C++ online submissions for Maximal Square.
Memory Usage: 10.6 MB, less than 100.00% of C++ online submissions for Maximal Square.
221. Maximal Square
Medium
121231FavoriteShare
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.
Example:
Input:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Output: 4
class Solution {
public:
//左上角为顶点 查找最大面积 访问过的1全部标记为访问
int maximalSquare(vector<vector<char>>& matrix)
{
int max = 0;
for (int i = 0; i < matrix.size(); i++)
{
for (int j = 0; j < matrix[i].size(); j++)
{
if (matrix[i][j] == '1') //是1且没有访问过
{
int temp = 1;
int length = 1;//当前边长
while (true)//每循环一次边长加一 正方形新加入最右边一列 最下面一行
{
++length;//测试边长增加还是正方形吗
if ((i + length - 1) >= matrix.size()) //出界
{
--length;
break;
}
if ((j + length - 1) >= matrix[i].size()) //出界
{
--length;
break;
}
bool out = false;
for (int k = 0; k < length; k++) //测试新加入的列是不是都是1 纵坐标不变 横坐标动
{
if (matrix[k + i][j + length - 1]=='1')
{
}
else
{
out = true;//跳出循环
--length;//length不能变长
break;
}
}
if (out)break;
for (int k = 0; k < length-1; k++) //测试新加入的行是不是都是1 横坐标不变 纵坐标动
{
if (matrix[i + length - 1][k + j] == '1')
{
}
else
{
out = true;//跳出循环
--length;//length不能变长
break;
}
}
if (out)break;
}
temp = length * length;
// cout<<length<<endl;
max = (max > temp) ? max : temp;
}
}
}
return max;
}
};