221. 最大正方形
阿新 • • 發佈:2021-06-25
我們用 \(\textit{dp}(i, j)\) 表示以 \((i,j)\) 為右下角,且只包含 \(1\) 的正方形的邊長最大值。如果我們能計算出所有 \(\textit{dp}(i, j)\) 的值,那麼其中的最大值即為矩陣中只包含 \(1\) 的正方形的邊長最大值,其平方即為最大正方形的面積。
那麼如何計算 \(\textit{dp}\) 中的每個元素值呢?對於每個位置 \((i,j)\),檢查在矩陣中該位置的值:
如果該位置的值是 \(0\),則 \(\textit{dp}(i, j) = 0\),因為當前位置不可能在由 \(1\) 組成的正方形中;
如果該位置的值是 \(1\),則 \(\textit{dp}(i, j)\)
class Solution { public: int maximalSquare(vector<vector<char>>& matrix) { int n = matrix.size(), m = matrix[0].size(); vector<vector<int>> f(n + 1, vector<int>(m + 1)); int res = 0; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) if(matrix[i - 1][j - 1] == '1') { f[i][j] = min(f[i - 1][j], min(f[i][j - 1], f[i - 1][j - 1])) + 1; res = max(res, f[i][j]); } return res * res; } };