Maximal Square
LeetCode上的221题:https://leetcode.com/problems/maximal-square/
文章目录
题目
给出一个二维的数组M,元素为‘0’或1,找出最大的正方形,正方形的所有元素都为‘1’,要求返回该正方形的面积。
Example1:
Input:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Output: 4
题解
令s(i, j)表示以下标(i, j)为正方形右下角的最大正方形边长,那么对所有M(i, j)==‘1’ 我们可以将s(i, j)分解为:
s(i, j) = min( s(i-1, j-1), s(i - 1, j), s(i, j-1) ) + 1。
因为若M(i, j) == ‘0’, 显然s(i, j) = 0.
那么基准情况为s(i, 0) = M(i, 0), s(0, i) = M(0, i)
最后遍历所有s(i, j)找到最大的边长,返回面积。
代码
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int maxSize = 0;
int row = matrix.size();
if (row == 0) return 0;
int col = matrix[0].size();
if (col == 0) return 0;
vector<vector<int>> square(row, vector<int>(col, 0));
for (int i = 0; i < row; i++) {
if (matrix[i][0] == '1') square[i][0] = 1;
}
for (int i = 0; i < col; i++) {
if (matrix[0][i] == '1') square[0][i] = 1;
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
if (matrix[i][j] == '1') {
square[i][j] = min(square[i-1][j-1], min(square[i-1][j], square[i][j-1])) + 1;
}
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (square[i][j] > maxSize) maxSize = square[i][j];
}
}
return maxSize*maxSize;
}
};