最大正方形

最大正方形

给定一个由0和1组成的2维矩阵,返回该矩阵中最大的由1组成的正方形的面积


## 例如:[[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]] 返回值:4

class Solution {
public:
    /**
     * 最大正方形
     * @param matrix char字符型vector<vector<>> 
     * @return int整型
     */
    struct maxxy
    {
        int x;//记录matrix[i][j]的最大行列连续1的个数
        int y;
    };
    int solve(vector<vector<char> >& matrix) {
        // write code here

        int m=0;//用以记录行和列的最大连续为‘1’的个数
        int n=0;
        maxxy mid;
        vector<vector<maxxy>> ans(matrix.size(),vector<maxxy> (matrix[0].size(),{0,0}));
        for(int j=0;j<matrix[0].size();j++)
        {

            for(int i=0;i<matrix.size();i++)
            {
               if(matrix[i][j]=='1')
               {
                   m++;
                   ans[i][j].y=m;
               }
               else
               {
                   m=0;
               }
            }
            m=0;
        }
        for(int i=0;i<matrix.size();i++)
        {
            for(int j=0;j<matrix[0].size();j++)
            {
                if(matrix[i][j]=='1')
                {
                    n++;
                    ans[i][j].x=n;
                }
                else
                {
                    n=0;
                }
            }
            n=0;
        }
        vector<int> b;
        for(int i=0;i<matrix.size();i++)
        {
            for(int j=0;j<matrix[0].size();j++)
            {
                int a=min(ans[i][j].x,ans[i][j].y);
                if(i==0||j==0)
                {
                    if(a!=0)
                    {
                        b.push_back(1);
                    }
                }
                else
                {
                    int val=0;
                    for(int k=0;k<a;k++)
                    {
                        if(min(ans[i-k][j-k].x,ans[i-k][j-k].y)>=a-k)
                        {
                            val++;
                        }
                     }
                    if(val==a)
                    {
                        b.push_back(a);
                    }
                }
                
            }
        }
        sort(b.begin(),b.end());
        int num=b[b.size()-1];
        return num*num;
    }
    };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值