zoukankan      html  css  js  c++  java
  • 221. Maximal Square

    原题链接

    221. Maximal Square

    题目描述

    在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。

    示例 1:

    输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
    输出:4

    示例 2:

    输入:matrix = [["0","1"],["1","0"]]
    输出:1

    示例 3:
    输入:matrix = [["0"]]
    输出:0

    题目分析

    可以使用动态规划降低时间复杂度。我们用 dp(i,j) 表示以 (i,j) 为右下角,且只包含 1 的正方形的边长最大值。
    如果我们能计算出所有 dp(i,j) 的值,那么其中的最大值即为矩阵中只包含 1 的正方形的边长最大值,其平方即为最大正方形的面积。

    那么如何计算 dp 中的每个元素值呢?对于每个位置 (i,j),检查在矩阵中该位置的值:

    如果该位置的值是 0,则 dp(i,j)=0,因为当前位置不可能在由 1 组成的正方形中;

    如果该位置的值是 1,则 dp(i,j) 的值由其上方、左方和左上方的三个相邻位置的 dp 值决定。
    具体而言,当前位置的元素值等于三个相邻位置的元素中的最小值加 1,状态转移方程如下:
    dp(i,j)=min(dp(i−1,j), dp(i−1,j−1), dp(i,j−1)) + 1

    如果读者对这个状态转移方程感到不解,可以参考 1277. 统计全为 1 的正方形子矩阵的官方题解,其中给出了详细的证明。

    此外,还需要考虑边界条件。如果 i 和 j 中至少有一个为 0,则以位置 (i,j) 为右下角的最大正方形的边长只能是 1,因此 dp(i,j)=1。

    代码

    class Solution {
    public:
        int maximalSquare(vector<vector<char>>& matrix) {
            int m = matrix.size(), n = matrix[0].size();
            vector<vector<int>> dp(m, vector<int>(n, 0));
    
            int maxSide = 0;
            for(int i = 0; i < m; i++){
                for(int j = 0; j < n; j++){
                    if(matrix[i][j] == '1'){
                        if(i == 0 || j == 0){
                            dp[i][j] = 1;
                        } else {
                            dp[i][j] = min(dp[i-1][j-1], min(dp[i][j-1], dp[i-1][j])) + 1;
                        }
    
                        maxSide = max(maxSide, dp[i][j]);
                    }
                }
            }
    
            return maxSide*maxSide;
        }
    };
    
    只有0和1的世界是简单的
  • 相关阅读:
    题解 CF934A 【A Compatible Pair】 ——贪心
    洛谷 P3381 【【模板】最小费用最大流】
    洛谷 P3376 【【模板】网络最大流】
    洛谷 P1027 【Car的旅行路线】
    TYVJ P1039 【忠诚2】
    洛谷 P1273 【有线电视网】
    斯特林数相关
    从 简单容斥 到 min-max 容斥 与 二项式反演
    POI2011 Lightning Conductor
    LOJ6089 小 Y 的背包计数问题
  • 原文地址:https://www.cnblogs.com/nullxjx/p/15023184.html
Copyright © 2011-2022 走看看