leetcode 221 最大正方形

题目描述: 

  在一个由0和1组成的矩阵内,找到只包含1的最大正方形的最大面积。

题解:

  考虑动态规划。用$dp(i,j)$表示以$(i,j)$为右下角,且只包含1的正方形的边长的最大值。状态可以参考(leetcode 1277),如下:

  • 如果当前位置为0,$dp(i,j) = 0$
  • 如果当前位置为1,当前状态由其左方、上方、左上方共同决定:$dp(i,j) = min(dp(i,j-1) , dp(i-1,j),dp(i-1,j-1)) + 1$

  下图给出了dp的计算过程:

  

AC代码如下:

  

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) {
            return 0;
        }
        int maxSide = 0;
        int rows = matrix.size(), columns = matrix[0].size();
        vector<vector<int>> dp(rows, vector<int>(columns));
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < columns; j++) {
                if (matrix[i][j] == '1') {
                    if (i == 0 || j == 0) {
                        dp[i][j] = 1;
                    } else {
                        dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
                    }
                    maxSide = max(maxSide, dp[i][j]);
                }
            }
        }
        int maxSquare = maxSide * maxSide;
        return maxSquare;
    }
};

 

posted @ 2020-05-08 11:20  猪突猛进!!!  阅读(187)  评论(0编辑  收藏  举报