LeetCode 221. 最大正方形 c++/java详细题解

Posted 林深时不见鹿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 221. 最大正方形 c++/java详细题解相关的知识,希望对你有一定的参考价值。

1、题目

在一个由 '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

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 300
  • matrix[i][j]'0''1'

2、思路

(动态规划) O ( n m ) O(nm) O(nm)

状态表示: f[i][j]表示所有以(i,j)为右下角的且只包含1的正方形的边长最大值。

状态计算:

对于每个位置 (i, j),检查在矩阵中该位置的值:

  • 如果该位置的值是 0,则 f[i, j] = 0,因为当前位置不可能在由 1 组成的正方形中。
  • 如果该位置的值是 1,则 f[i, j]的值由其上方、左方和左上方的三个相邻位置的状态值决定。具体而言,当前位置的元素值等于三个相邻位置的元素中的最小值加 1

状态转移方程: f[i,j]=min(f[i−1,j−1],f[i−1,j],f[i,j−1])+1

类似于 木桶的短板理论, 附近的最小边长,才与(i,j)的最长边长有关。

时间复杂度分析: O ( n m ) O(nm) O(nm),其中 n n n m m m是矩阵的行数和列数。

3、c++代码

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        if (matrix.empty() || matrix[0].empty()) return 0;
        int n = matrix.size(), m = matrix[0].size();
        vector<vector<int>> f(n + 1, vector<int>(m + 1));

        int res = 0;
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= m; j ++ )
                if (matrix[i - 1][j - 1] == '1') {
                    f[i][j] = min(f[i - 1][j], min(f[i][j - 1], f[i - 1][j - 1])) + 1;
                    res = max(res, f[i][j]);
                }

        return res * res;
    }
};

4、java代码

class Solution {
    public int maximalSquare(char[][] matrix) {
        if(matrix.length == 0 || matrix[0].length == 0) return 0;
        int n = matrix.length, m = matrix[0].length;
        int[][] f = new int[n + 1][m + 1];
        int res = 0;
        for(int i = 1;i <= n;i ++)
            for(int j = 1;j <= m;j ++)
                if(matrix[i - 1][j - 1] == '1')
                {
                    f[i][j] = Math.min(f[i - 1][j - 1], Math.min(f[i - 1][j], f[i][j - 1])) + 1;
                    res = Math.max(res, f[i][j]);
                }

        return res * res;
    }
}

原题链接: 221. 最大正方形

以上是关于LeetCode 221. 最大正方形 c++/java详细题解的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 221. Maximal Square 最大正方形(中等)

leetcode221.最大正方形

leetcode221.最大正方形

[LeetCode] 221. 最大正方形(DP)

LeetCode | 221. 最大正方形

LeetCode 221. 最大正方形 c++/java详细题解