leetcode 221. 最大正方形

题目描述:

在一个由 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 };
原文地址:https://www.cnblogs.com/LJ-LJ/p/11323197.html