题解 | #奶牛的活动面积# 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
的平方作为结果。