221 longest-consecutive-sequence
题目:
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
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列为右下角的最大正方形边长,则dp[i][j] = min( dp[i-1][j-1], dp[i-1][j], dp[i-1][j] ) + 1,因为以当前点为右下角的正方形的左上角受限于其上、左、和左上三点组成的最小值。
【注】需要注意的是参数是char,不是int。
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0)
return 0;
int r = matrix.size(), c = matrix[0].size();
vector<vector<int>> dp(r, vector<int>(c, '0'));
// base
int max_area = matrix[0][0];
for (int i = 0; i < r; i++)
{
dp[i][0] = matrix[i][0];
max_area = max(max_area, dp[i][0]);
}
for (int j = 1; j < c; j++)
{
dp[0][j] = matrix[0][j];
max_area = max(max_area, dp[0][j]);
}
// common
for (int i = 1; i < r; i++)
{
for (int j = 1; j < c; j++)
{
if (matrix[i][j] - '0')
{
dp[i][j] = min({ dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1] }) + 1;
max_area = max(max_area, dp[i][j]);
}
}
}
return (max_area-'0')*(max_area-'0');
}
};