您的位置:首页 > 其它

Maximal Square

2015-06-17 21:27 134 查看
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 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

Return 4.

解题思路:

从小到大枚举最大全1正方形的边长,我们验证当前边长长度时是否存在一个正方形是全1正方形,如果得到则直接退出。我们可以利用这个方法来验证这个问题,首先每个元素要么是0要么是1,这样如果一个子正方形是全1正方形的时候,则子正方形的元素和正好为政方面的面积,问题得以解决。

class Solution {
public:
    /* 枚举 + DP */
    int maximalSquare(vector<vector<char>>& matrix) {
        int arr[210][210];
        int sum[210][210];
        int n = matrix.size();
        if(n == 0) return 0;
        int m = matrix[0].size();
        if(m == 0) return 0;
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= m; ++j) {
                arr[i][j] = matrix[i-1][j-1] - '0';   
            }
        }
        for(int i = 1; i <= n; ++i) {
            for(int j = 1; j <= m; ++j) {
                sum[i][j] = arr[i][j];
                sum[i][j] += sum[i][j-1];
                sum[i][j] += sum[i-1][j];
                sum[i][j] -= sum[i-1][j-1];
            }
        }
        bool ok = false;
        int ans = 0;
        int len = min(n, m);
        for(int k = len - 1; k >= 0; --k) {
            for(int i = 1; i + k <= n; ++i) {
                for(int j = 1; j + k <= m; ++j) {
                    int x1 = i, y1 = j;
                    int x2 = i + k, y2 = j + k;
                    if(sum[x2][y2] - sum[x2][y1-1] - sum[x1-1][y2] + sum[x1-1][y1-1] == (k+1)*(k+1)) {
                        ok = true;
                        ans = (k+1)*(k+1);
                        break;
                    }
                }
                if(ok) break;
            }
            if(ok) break;
        }
        return ans;
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: