力扣221.最大正方形


力扣221.最大正方形题解

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

示例 1:

图1 从官网安装node js

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

示例 2:

图1 从官网安装node js

输入: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'

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximal-square

这道题可以这样理解,逐个遍历,把每次遍历的地方当成该正方形的右下角,然后分别在该格子处向上,向左,向左上角试探,找寻满足正方形的格子,如果该格子在第一行或者第一列,那么就把最大值记为1或者0,把长度记下来平方即可求得面积

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public int maximalSquare(char[][] matrix) {
int m = matrix.length , n = matrix[0].length , max = 0;
int [][] dp = new int[m][n];
//开始遍历
for(int i = 0 ; i < m ; i++){
for(int j = 0; j < n ;j++){
//开始判断右下角是否为进行动态规划
if(matrix[i][j] != '0'){
//如果是0,判断该区域是否为第一行或者第一列
if(i == 0 || j == 0){
dp[i][j] = 1;
//dp公式
}else{
dp[i][j] = Math.min(Math.min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
}
//录入最大值并与每一次求得的最大值比较求得最大值
max = Math.max(max , dp[i][j]);
}else{
dp[i][j] = 0;
}
}
}
//返回面积
return max*max;
}
}

结果