Given a 2D binary matrix filled with 0's and 1's, find the largest square containing all 1's and return its area.
For example, given the following matrix:
1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0
Return 4.
枚举就OK了,时间复杂度为O(n^3),276ms AC。
1 class Solution { 2 public: 3 int getArea(vector &array, int k) { 4 if (array.size() < k) return 0; 5 int cnt = 0; 6 for (int i = 0; i < array.size(); ++i) { 7 if (array[i] != k) cnt = 0; 8 else ++cnt; 9 if (cnt == k) return k * k;10 }11 return 0;12 }13 int maximalSquare(vector>& matrix) {14 vector array;15 int res = 0;16 for (int i = 0; i < matrix.size(); ++i) {17 array.assign(matrix[0].size(), 0);18 for (int j = i; j < matrix.size(); ++j) {19 for (int k = 0; k < matrix[0].size(); ++k) if (matrix[j][k] == '1') ++array[k];20 res = max(res, getArea(array, j-i+1));21 }22 }23 return res;24 }25 };
可以使用动态规划优化到O(n^2),下面的代码12ms AC。构造一个新的矩阵dp,dp[i][j]表示以点(i, j)为右下角的正方形的边长;状态转移方程:
dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;
对于题目所给的例子就有:
1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0
转化成:
1 0 1 0 01 0 1 1 11 1 1 2 11 0 0 1 0
1 class Solution { 2 public: 3 int maximalSquare(vector>& matrix) { 4 if (matrix.empty() || matrix[0].empty()) return 0; 5 int M = matrix.size(), N = matrix[0].size(), res = 0; 6 vector > dp(M, vector (N, 0)); 7 for (int i = 0; i < M; ++i) if (matrix[i][0] == '1') { 8 dp[i][0] = 1; res = 1; 9 }10 for (int j = 0; j < N; ++j) if (matrix[0][j] == '1') {11 dp[0][j] = 1; res = 1;12 }13 for (int i = 1; i < M; ++i) {14 for (int j = 1; j < N; ++j) {15 if (matrix[i][j] == '1') 16 dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;17 res = max(res, dp[i][j]);18 }19 }20 return res * res;21 }22 };