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
class Solution {
public:
    /* 动态规划
     * dp[i][j] 表示遍历到(i,j)时最大的边长
     * dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
     * 怎么来的: 可以这么想 dp[i][j]对应的最大正方形 应该和相邻的三个角点对应的正方形相交 因此 取min
     * */
    int maximalSquare(vector<vector<char>>& matrix) {
        if(matrix.empty() || matrix[0].empty()) return 0;

        int rowmax=matrix.size(), colmax=matrix[0].size(), maxlen=0;
        vector<vector<int>> dp(rowmax, vector<int>(colmax, 0));
        // 分开赋值方法存在问题: 对于只有一行或者一列元素 执行for循环会出错 而且 对maxlen赋值得不到执行
//        for(int j=0;j<colmax;j++)
//            if(matrix[0][j] == '1'){
//                dp[0][j] = 1;
//                maxlen = 1;
//            }
//        for(int i=0;i<rowmax;i++)
//            if(matrix[i][0] == '1'){
//                dp[i][0] = 1;
//                maxlen = 1; // 避免只有一行或者一列或者只有一个的情况 这时下面对maxlen赋值的for循环没有得到执行
//            }
        for(int i=0;i<rowmax;i++)
            for(int j=0;j<colmax;j++){
                if(i == 0 || j == 0)    
                    dp[i][j] = matrix[i][j]-'0'; // 初始化
                else if(matrix[i][j] == '1')
                    dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))+1;
                maxlen = max(maxlen, dp[i][j]); // 一边初始化 一边对maxlen赋值
            }

        return maxlen*maxlen;
    }
};

猜你喜欢

转载自blog.csdn.net/futangxiang4793/article/details/88739854