Description:
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.
For example, given the following matrix:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Return 4.
算法分析:
我们考虑brute force的方法,这种方法的机理就是就是把数组中每一个点都当成正方形的左顶点来向右下方扫描,来寻找最大正方形。具体的扫描方法是,确定了左顶点后,再往下扫的时候,正方形的竖边长度就确定了,只需要找到横边即可,这时候我们使用直方图的原理,从其累加值能反映出上面的值是否全为1。通过这种方法我们就可以找出最大的正方形。
代码如下:
#include<vector>
class Solution{
public:
int maximalSquare(vector<vector<char>& matrix>){
int res = 0;
for(int i=0; i<matrix.size();++i){
vector<int> v(matrix.size(),0);
for(int j=i;j<matrix.size();++j){
for(int k=0;k<matrix[j].sieze();++k){
if(matrix[j][k]=='1')
++v[k];
}
res = max(res,getSquareArea(v,j-i+1));
}
}
return res;
}
int getSquareArea(vector<int>&v,int k){
if(v.size()<k)
return 0;
for count = 0;
for(in i=0;i<v.size();++i){
if(v[i]!=k) count = 0;
else ++count;
if(count ==k)return k*k;
}
}