Keshawn_lu's Blog

Leetcode 221. 最大正方形

字数统计: 488阅读时长: 2 min
2020/05/08 Share

题目简介:

在一个由 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;

}
};
CATALOG
  1. 1. 题目简介: