题解 | #最大正方形#

没人暴力,我来暴力

遍历二维数组的每一个结点

如果结点值为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;
    }
};

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务