C++ 中的最大正方形


假设我们有一个用 0 和 1 填充的 2D 二进制矩阵。我们必须找到仅包含 1 的最大正方形并返回其面积。因此,如果矩阵如下所示 −

10100
10110
11111
10010

那么输出将为 4

为解决此问题,我们将按照以下步骤操作 −

  • ans := 0, n := 行数,c := 行数

  • 如果 n 为 0,则返回 0

  • 创建另一个 (n x c) 阶矩阵

  • 对于 i 的范围从 0 到 n – 1

    • 对于 j 的范围从 0 到 c – 1

      • m[i, j] := matrix[i, j]

      • ans := m[i, j] 和 ans 的最大值

  • 对于 j 的范围从 0 到 c – 1

    • 如果不为 0,则 m[i, j],那么

      • m[i, j] := 1 + m[i + 1, j]、m[i, j-1]、m[i + 1, j-1] 中的最小值,

    • ans := m[i, j] 和 ans 的最大值

  • 返回 ans*ans

让我们看看以下实现以获得更好的理解 −

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int maximalSquare(vector<vector<char>>& matrix) {
      int ans = 0;
      int n = matrix.size();
      if(!n)return 0;
      int c = matrix[0].size();
      vector<vector<int>> m(n, vector <int> (c));
      for(int i =0;i<n;i++){
         for(int j = 0; j<c;j++){
            m[i][j] = matrix[i][j] - '0';
            ans = max(m[i][j],ans);
         }
      }
      for(int i =n-2;i>=0;i--){
         for(int j =1;j<c;j++){
            if(m[i][j]){
               m[i][j] = 1 + min({m[i+1][j],m[i][j-1],m[i+1][j-1]});
            }
            ans = max(ans,m[i][j]);
         }
      }
      return ans*ans;
   }
};
main(){
   vector<vector<char>> v = {{'1','0','1','0','0'},{'1','0','1','1','1'},{'1','1','1','1','1'},         {'1','0','0','1','0'}};
   Solution ob;
   cout << ((ob.maximalSquare(v)));
}

输入

[["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]

输出

4

更新于: 2020 年 4 月 30 日

313 次查看

开启你的 职业生涯

通过完成课程获得认证

开始
广告信息