221 最大正方形

本文最后更新于:2022年4月9日 中午

在一个由 '0''1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。

示例 1:

max1grid

1
2
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4

示例 2:

max2grid

1
2
输入:matrix = [["0","1"],["1","0"]]
输出:1

示例 3:

1
2
输入:matrix = [["0"]]
输出:0

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 300
  • matrix[i][j]'0''1'

Solution

参考:@lzhlyle

  • 动态规划

dp(i + 1, j + 1) 是以 matrix(i, j) 为右下角的正方形的最大边长

若某格子值为 1,则以此为右下角的正方形的、最大边长为:上面的正方形、左面的正方形或左上的正方形中,最小的那个,再加上此格。

dp 具体定义:dp[i + 1] [j + 1] 表示 「以第 i 行、第 j 列为右下角的正方形的最大边长」

题目要求面积。根据 「面积 = 边长 x 边长」可知,我们只需求出 最大边长 即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
if (m < 1 || n < 1) return 0;
int res = 0;

vector<vector<int>> dp(m+1, vector<int>(n+1, 0));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (matrix[i][j] == '1') {
dp[i+1][j+1] = min({dp[i+1][j], dp[i][j+1], dp[i][j]}) + 1;
res = max(dp[i+1][j+1], res);
}
}
}
return res * res;
}
};

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!