题目描述:
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
思路分析:
一道动态规划的题。由于是正方形,首先单一的‘1’即为最小的正方形,接下来需要考察其外围区域是否为1。具体来说,dp[i][j]表示包含该点的最大正方形的边长。同时不断去更新这个最大边长。这里的递推是从前向后,如dp[i][j]=1,那么需要看dp[i-1][j],dp[i][j-1]以及dp[i-1][j-1]三个部分,动态递推公式为dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])+1,更新最大边长。需要注意两个边界,即第一行和第一列,直接判断01,赋值即可。
代码:
1 class Solution { 2 public: 3 int maximalSquare(vector<vector<char>>& matrix) { 4 int row = matrix.size(); 5 if(row == 0) 6 return 0; 7 int col = matrix[0].size(); 8 vector<vector<int>> res(row, vector<int>(col, 0)); 9 int maxval = 0; 10 for(int i=0; i<row; i++) 11 { 12 res[i][0] = matrix[i][0]-'0'; 13 maxval = max(maxval, res[i][0]); 14 } 15 for(int i=0; i<col; i++) 16 { 17 res[0][i] = matrix[0][i]-'0'; 18 maxval = max(maxval, res[0][i]); 19 } 20 for(int i=1; i<row; i++) 21 { 22 for(int j=1; j<col; j++) 23 { 24 if(matrix[i][j] == '0') 25 res[i][j] = 0; 26 else 27 { 28 res[i][j] = min(res[i-1][j-1], min(res[i-1][j], res[i][j-1]))+1; 29 maxval = max(maxval, res[i][j]); 30 } 31 } 32 } 33 return maxval*maxval; 34 } 35 };