给定一个由 '0' 和 '1' 组成的2维矩阵,返回该矩阵中最大的由 '1' 组成的正方形的面积。输入的矩阵是字符形式而非数字形式。
数据范围:矩阵的长宽满足
,矩阵中的元素属于 {'1','0'}
进阶:空间复杂度
, 时间复杂度
[[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]]
4
[[1,0,0],[0,0,0],[0,0,0]]
1
用dp[i][j]表示以matrix[i][j]为右下角的全为1组成的最大正方形的边长,则:
1. 若matrix[i][j] == 0, 则dp[i][j] = 0
2. 若matrix[i][j] == 1, 则dp[i][j] = min{dp[i-1][j], dp[i][j-1], dp[i-1][j-1]} + 1
原因可以看下面这张图:
class Solution { public: /** * 最大正方形 * @param matrix char字符型vector<vector<>> * @return int整型 */ int solve(vector<vector<char> >& matrix) { if(matrix.size()==0 || matrix[0].size()==0) { return 0; } int Rows = matrix.size(), Cols = matrix[0].size(); vector<vector<int>> dp(Rows, vector<int>(Cols, 0)); int maxSide = 0; for(int i = 0; i < Rows; i++) { for(int j = 0; j < Cols; j++) { if(matrix[i][j] == '1') { if(i==0 || j==0) { dp[i][j] = 1; } else { dp[i][j] = std::min(std::min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1; } } maxSide = std::max(maxSide, dp[i][j]); } } return (long long)maxSide * maxSide; } };