题解 | #最大正方形#
没人暴力,我来暴力
遍历二维数组的每一个结点
如果结点值为0则跳过
如果结点值为1,则进行广搜
判断当前结点的右结点,下结点,右下结点是否也都是1,
如果是则将这三个结点入队,边长++,然后将边长的平方与当前最大面积进行比较,并进行下一步广搜
如果不是,则直接返回
#include <climits> class Solution { public: /** * 最大正方形 * @param matrix char字符型vector<vector<>> * @return int整型 */ int maxn = 0; bool is_valid(vector<vector<char> >& matrix,int i,int j){ //查看当前结点的右节点,下节点,右下结点是否合法 bool flag = true; if(i+1 >= matrix.size()){ flag = false; }else if(j+1 >= matrix[i].size()){ flag = false; }else{ if(matrix[i+1][j] == '0' || matrix[i][j+1] == '0' || matrix[i+1][j+1] == '0'){ flag = false; } } return flag; } int biggest(vector<vector<char> >& matrix,int i,int j){ //查看以i,j为左上角的正方形的面积 int now = 1; deque<pair<int,int>> q; deque<pair<int,int>> tq; bool flag = true; q.push_back(pair<int,int>(i,j)); while((!q.empty()) && flag){ //广搜 pair<int,int> temp; while(!q.empty()){ temp = q.front(); q.pop_front(); if(is_valid(matrix, temp.first, temp.second)){ //如果当前结点的下一步合法,则将右、下和右下结点入队 tq.push_back(pair<int,int>(temp.first+1,temp.second)); tq.push_back(pair<int,int>(temp.first,temp.second+1)); tq.push_back(pair<int,int>(temp.first+1,temp.second+1)); }else{ flag =false; } } if(flag == true){ now++; } while(!tq.empty()){ temp = tq.front(); tq.pop_front(); q.push_back(temp); } } if(now*now > maxn){ maxn = now*now; } return now; } int solve(vector<vector<char> >& matrix) { // write code here int answer = 0; for(int i = 0 ; i < matrix.size(); i++){ for(int j = 0 ; j < matrix[i].size(); j++){ if(matrix[i][j] == '1'){ biggest(matrix,i,j); } } } answer = maxn; return answer; } };