leetcode-华为专题-221. 最大正方形

 

leetcode-华为专题-221. 最大正方形

leetcode-华为专题-221. 最大正方形

 

三面列举了三种不同最小值所在的位置,可以看出只要当前元素为1,那么dp[i][j]就等于左上,左、上,中的最小值加1。

比如图一种最小值为3。问号所在位置元素为1,那么dp问号处的值就为4,因为当取三者最小值的时候,其余两个4,4所在位置的元素肯定为1。不然此处的dp值肯定比3还小。

 

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        vector<vector<int>> dp(m,vector<int>(n,0));
        int maxval = INT_MIN;
        // dp[i][j]: 包含matrix[i][j]在内的最大正方形的边长
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(matrix[i][j] == '1'){
                    if(i==0||j==0) // 左、上边界,且当前元素为1,则 dp[i][j]为1
                        dp[i][j] = 1;
                    else
                        dp[i][j] = min(dp[i][j-1],min(dp[i-1][j-1],dp[i-1][j]))+1;
                }
                maxval = max(maxval, dp[i][j]);
            }
        }
        return maxval*maxval;
    }
};

 

上一篇:「与」存储后要怎么查询


下一篇:2021“MINIEYE杯”中国大学生算法设计超级联赛(3)题解