221. 最大正方形—求得最大正方形面积
题目描述
在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。
求解思路&实现代码
class Solution {
public static int maximalSquare(char[][] m) {
if (m == null || m.length == 0 || m[0].length == 0) {
return 0;
}
int N = m.length;
int M = m[0].length;
int[][] dp = new int[N + 1][M + 1];
int max = 0;
for (int i = 0; i < N; i++) {
if (m[i][0] == '1') {
dp[i][0] = 1;
max = 1;
}
}
for (int j = 1; j < M; j++) {
if (m[0][j] == '1') {
dp[0][j] = 1;
max = 1;
}
}
for (int i = 1; i < N; i++) {
for (int j = 1; j < M; j++) {
if (m[i][j] == '1') {
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]);
}
}
}
return max * max;
}
}
1277. 统计全为 1 的正方形子矩阵—求得正方形总个数
题目描述
给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。
求解思路&实现代码
class Solution {
public int countSquares(int[][] m) {
if (m == null || m.length == 0 || m[0].length == 0) {
return 0;
}
int N = m.length;
int M = m[0].length;
int[][] dp = new int[N + 1][M + 1];
int ans = 0;
for (int i = 0; i < N; i++) {
if (m[i][0] == 1) {
dp[i][0] = 1;
ans+=1;
}
}
for (int j = 1; j < M; j++) {
if (m[0][j] == 1) {
dp[0][j] = 1;
ans+=1;
}
}
for (int i = 1; i < N; i++) {
for (int j = 1; j < M; j++) {
if (m[i][j] == 1) {
dp[i][j] = Math.min(Math.min(dp[i - 1][j],dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
ans+=dp[i][j];
}
}
}
return ans;
}
}