题目简介:
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
1 2 3 4 5 6 7 8
| 输入:
1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0
输出: 4
|
思路:利用动态规划的思想,dp[i] [j]代表的是以第i行第j列为正方形右下角坐标的能形成的最大的正方形的边长。
首先将第1行和第1列进行初始化。然后遍历其他的坐标,如果当前坐标为0,即形成不了正方形,dp[i] [j]即为0, 若为1,则比较dp[i - 1] [j] 和 dp[i] [j - 1] 的值,选择两者间较小的值,设为length(如下图的第一个例子,因为dp[i - 1] [j] = 1, 所以第i - 2 行存在0的点,所以dp[i] [j] 的值 只能 < 3),dp[i] [j] 具体是多少需要看正方形[i- length] [j - length]的点的值为0还是1,第一个例子里为1,所以dp[i] [j] = 2。
第二个例子里较小值为2,所以就看正方形[i- 2] [j - 2]的值,如果为1,则dp[i] [j] = 2+1 = 3,否则就为2。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| class Solution { public: int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.empty()) return 0;
vector<vector<int>> dp(matrix.size(), vector<int>(matrix[0].size(), 0)); int res = 0;
for(int i = 0; i < matrix[0].size(); i++){
if(matrix[0][i] == '0') dp[0][i] = 0; else dp[0][i] = 1;
res = max(res, dp[0][i]); }
for(int i = 0; i < matrix.size(); i++){
if(matrix[i][0] == '0') dp[i][0] = 0; else dp[i][0] = 1; res = max(res, dp[i][0]); }
for(int i = 1; i < matrix.size(); i++){
for(int j = 1; j < matrix[i].size(); j++){
if(matrix[i][j] == '0') continue; dp[i][j] = 1;
int length = min(dp[i - 1][j], dp[i][j - 1]);
if(length > 0){
if(matrix[i - length][j - length] == '1') dp[i][j] = length + 1; else dp[i][j] = length; }
res = max(res, dp[i][j]); } }
return res * res;
} };
|