题目:
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.
Example 1:
Input: matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]] Output: 4
Example 2:
Input: matrix = [["0","1"],["1","0"]] Output: 1
Example 3:
Input: matrix = [["0"]] Output: 0
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j]
is'0'
or'1'
.
代码:
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int row = matrix.size();
if (row < 1)
return 0;
int col = matrix[0].size();
int maxSum = 0;
vector<int> left(col + 1, 0), right(col + 1, col), height(col + 1, 0);
for (int i = 0; i < row; i++)
{
int cur_left = 0, cur_right = col;
for (int j = 0; j < col; j++)
{
if (matrix[i][j] == '1')
{
left[j] = max(left[j], cur_left);
}
else
{
cur_left = j + 1;
left[j] = 0;
}
}
for (int j = col - 1; j >= 0; j--)
{
if (matrix[i][j] == '1')
right[j] = min(right[j], cur_right);
else
{
cur_right = j;
right[j] = col;
}
}
for (int j = 0; j < col; j++)
{
if (matrix[i][j] == '1')
{
height[j] = height[j] + 1;
}
else
height[j] = 0;
}
for (int j = 0; j < col; j++)
{
int a = min(right[j] - left[j], height[j]);
maxSum = max(maxSum, a*a);
}
}
return maxSum;
}
};