【LeetCode 221】Maximal Square

题目描述

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

思路

思路一:通用的解法,先用动态规划求出dp[i][j]表示从0到[i,j]点组成的矩阵的1的个数。之后就可以在O(1)时间内求出任意矩阵的1的个数。遍历起点位置和边长,找到最大的边长。时间复杂度:O(n^3)
思路二:i,j 点能构成的最大边长,取决于i-1,j i-1,j-1 i,j-1三个点能组成正方形的边长最小值+1。时间复杂度:O(n^2)

代码

代码一:

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        if (matrix.empty()) return 0;
        
        int m = matrix.size();
        int n = matrix[0].size();
        vector<vector<int> > dp(m+1, vector<int>(n+1, 0));
        
        for (int i=1; i<=m; ++i) {
            for (int j=1; j<=n; ++j) {
                dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + matrix[i-1][j-1] - '0';
            }
        }
        
        int res = 0;
        for (int i=1; i<=m; ++i) {
            for (int j=1; j<=n; ++j) {
                for (int k=min(m-i+1, n-j+1); k>=res+1; --k) {
                    int edx = i+k-1;
                    int edy = j+k-1;
                    int sum = dp[edx][edy] - dp[i-1][edy] - dp[edx][j-1] + dp[i-1][j-1];
                    
                    if (sum == k*k) {
                        res = max(res, k);
                        break;
                    }
                }
            }
        }
        return res*res;
    }
};

代码二:

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        if (matrix.empty()) return 0;
        
        int m = matrix.size();
        int n = matrix[0].size();
        vector<vector<int> > dp(m+1, vector<int>(n+1, 0));
        
        int res = 0;
        for (int i=1; i<=m; ++i) {
            for (int j=1; j<=n; ++j) {
                if (matrix[i-1][j-1] == '0') dp[i][j] = 0;
                else {
                    dp[i][j] = min(min(dp[i-1][j-1], dp[i-1][j]), dp[i][j-1]) + 1;
                    res = max(res, dp[i][j]);
                }
            }
        }
        return res*res;
    }
};
发布了243 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/iCode_girl/article/details/104414749