221. Maximal Square(最大正方形)
题目大意
Given an m x n
binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area.
中文释义
给定一个填满 0 和 1 的 m x n
二进制矩阵,找出仅包含 1 的最大正方形,并返回其面积。
示例
-
示例 1:
- 输入:
matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
- 输出:
4
- 输入:
-
示例 2:
- 输入:
matrix = [["0","1"],["1","0"]]
- 输出:
1
- 输入:
-
示例 3:
- 输入:
matrix = [["0"]]
- 输出:
0
- 输入:
限制条件
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j]
是 ‘0’ 或 ‘1’。
解题思路
使用动态规划(DP)来解决问题。创建一个二维 dp
数组来存储到达每个位置时可能形成的最大正方形的边长。
步骤说明
- 初始化一个二维
dp
数组,其中dp[i][j]
表示在位置(i, j)
可能形成的最大正方形的边长。 - 遍历矩阵的每一个位置:
- 如果位置
(i, j)
是 1,则计算可能形成的最大正方形的边长,并更新dp[i][j]
。 - 更新记录的最大边长。
- 如果位置
- 返回最大正方形的面积(最大边长的平方)。
代码
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector<vector<int>> dp(m, vector<int>(n));
int maxSize = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (matrix[i][j] == '1') {
if (i == 0 || j == 0) {
dp[i][j] = 1; // 边界条件
} else {
dp[i][j] = min({dp[i-1][j], dp[i][j-1], dp[i-1][j-1]}) + 1;
}
maxSize = max(maxSize, dp[i][j]);
}
}
}
return maxSize * maxSize; // 返回面积
}
};