leetcode-221.最大正方形
动态规划(dp)
题目详情
在一个由 '0'
和 '1'
组成的二维矩阵内,找到只包含 '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
思路:
对于在矩阵内搜索正方形或长方形的题型,一种常见的做法是定义一个二维 dp 数组,其中
dp[i][j]
表示满足题目条件的、以(i, j)
为右下角的正方形或者长方形的属性。
本题我们用dp[i][j]
表示以第i
行第j
列为右下角的正方形的最大边长,对于dp[i][j]
,是否能和dp[i-1][j](左边)
dp[i][j-1](上边)
dp[i-1][j-1](左上角)
构成一个更大的正方形,取决于这三者的最小值,dp[i][j]
即为三者最小值加一
我的代码:
class Solution
{
public:
int maximalSquare(vector<vector<char>>& matrix)
{
if (matrix.empty() || matrix[0].empty())
return 0;
int m = matrix.size(), n = matrix[0].size(), max_side = 0;
vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0)); //将所有dp初始化为0
//dp[i][j]表示第i行第j列(matrix[i-1][j-1])为右下角的最大正方形的边长 (dp和matrix下标相差一)
for (int i = 1; i <= m; ++i)
{
for (int j = 1; j <= n; ++j)
{
if (matrix[i-1][j-1] == '1')
dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1; //因为min参数只有两个,所以这样写
max_side = max(max_side, dp[i][j]);
}
}
return max_side*max_side;
}
};
涉及知识点:
1.动态规划(dp)