题解 | #奶牛的活动面积# java
奶牛的活动面积
https://www.nowcoder.com/practice/666cb0dd46a2439fb7c44d24a9918bf7
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param land char字符型二维数组
* @return int整型
*/
public int maximalSquare (char[][] land) {
// write code here
int maxSide = 0;
if (land.length == 0 || land[0].length == 0) {
return maxSide;
}
int rows = land.length, cols = land[0].length;
int[][] dp = new int[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (land[i][j] == 'C') {
if (i == 0 || j == 0) {
dp[i][j] = 1;
} else {
dp[i][j] = Math.min(Math.min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
}
maxSide = Math.max(maxSide, dp[i][j]);
}
}
}
return maxSide * maxSide;
}
}
代码使用的编程语言是Java。
该题考察的知识点是动态规划。给定一个由字符 'C' 和 'O' 组成的二维字符数组 land,要求找出其中由字符 'C' 组成的最大正方形的边长。
代码解释如下:
- 定义一个名为
Solution的类,并声明了一个名为maximalSquare的方法,该方法接受一个vector<vector<char>>类型的参数land,返回一个int类型的结果。 - 首先初始化一个变量
maxSide为0,用于记录最大正方形的边长。 - 如果
land的行数或列数为0,则直接返回maxSide。 - 获取
land的行数和列数,并分别保存在变量rows和cols中。 - 创建一个二维向量
dp,大小为rows行cols列,用于记录以当前位置为右下角的最大正方形的边长。 - 使用嵌套循环遍历每个位置
(i, j):如果 land[i][j] 的值为 'C',表示当前位置可以构成正方形的一部分如果 i 或 j 等于0,表示当前位置在第一行或第一列,无法与其左上、上方或左侧的正方形相连,则将 dp[i][j] 更新为1否则,根据动态规划的思想,dp[i][j] 的值应该是 dp[i-1][j]、dp[i][j-1] 和 dp[i-1][j-1] 三个值中的最小值加1,因为它们可以组成更大的正方形更新 maxSide 为较大的值,即 max(maxSide, dp[i][j]) - 循环结束后,返回
maxSide的平方作为结果。
