Description
Given a 2D binary matrix filled with 0’s and 1’s, find the largest square containing only 1’s and return its area.
Example:
Input:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Output: 4
Solution
给一个二维数组,数组中有0有1,求由1组成的最大的正方形的面积。在这个数组中正方形肯定是:
1234
2234
3334
4444
这样的形式。所以使用动态规划解决。
We new a two-dimensional array to perform dynamic programming in this problem. If an element in matrix could be a square, then it up, left and up-left should be 1. So we could accord this to calculate the length of the square in the matrix.
The length of this element is the minum value of its up, left and up-left dp.
Code
class Solution {
public int maximalSquare(char[][] matrix) {
if (matrix.length == 0){
return 0;
}
int res = 0, m = matrix.length, n = matrix[0].length;
int[][] dp = new int[m + 1][n + 1];
for (int i = 1; i <= m; i++){
for (int j = 1; j <= n; j++){
if (matrix[i - 1][j - 1] == '1'){
dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])) + 1;
}
res = Math.max(res, dp[i][j]);
}
}
return res * res;
}
}
Time Complexity: O(n * m)
Space Complexity: O(n * m)