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详细题解的主要内容,如果未能解决你的问题,请参考以下文章