1725. 可以形成最大正方形的矩形数目题解
题目来源:1725. 可以形成最大正方形的矩形数目
2022.02.05每日一题
目的:统计矿工可以收获最大利益的采矿方式
根据题目的意思,我们可以使用 dfs 来进行搜索,然后注释到已经搜素过的点,每次搜素,寻找最大值
具体代码与注释如下
C++版本
class Solution {
public:
// 建立周边四个方向的访问数组
vector<vector<int>> dir = {{1, 0},
{-1, 0},
{0, 1},
{0, -1}};
// 创建一份金矿便于访问
vector<vector<int>> grid;
// 统计金矿的长与宽
int m, n;
// 记录结果
int res = 0;
int getMaximumGold(vector<vector<int>> &grid) {
// 对金矿进行拷贝
this->grid = grid;
// 计算金矿的长与宽
m = grid.size();
n = grid[0].size();
// 遍历金矿,如果遇见非空的单元格就从这个单元格开始搜索
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] != 0) {
dfs(i, j, 0);
}
}
}
// 返回结果
return res;
}
void dfs(int i, int j, int sum) {
// 使用 sum 来统计当前搜索的值的总和
sum += grid[i][j];
// 将 sum 值(当前搜索的值的总和)与结果 res 进行比较
res = max(res, sum);
// 使用 temp (临时变量)来存储当前格子的值
int temp = grid[i][j];
// 将当前的格子置为 0 ,防止被再次搜索(根据题意,每次每个格子只能被搜索一次)
grid[i][j] = 0;
//访问四个方向
for (vector<int> d: dir) {
int xx = i + d[0];
int yy = j + d[1];
// 如果在金矿的范围之内,并且当前格子的值不为 0,则继续进行搜索
if (xx >= 0 && xx < m && yy >= 0 && yy < n && grid[xx][yy] != 0) {
// 继续进行搜索
dfs(xx, yy, sum);
}
}
// 将当前的格子的值置回原来最初的值
grid[i][j] = temp;
}
};
Java版本
class Solution {
// 记录结果
int res = 0;
// 创建一份金矿便于访问
int[][] grid;
// 建立周边四个方向的访问数组
int[][] dir = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
// 统计金矿的长与宽
int n, m;
public int getMaximumGold(int[][] grid) {
// 对金矿进行拷贝
this.grid = grid;
// 计算金矿的长与宽
m = grid.length;
n = grid[0].length;
// 遍历金矿,如果遇见非空的单元格就从这个单元格开始搜索
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] != 0) {
dfs(i, j, 0);
}
}
}
// 返回结果
return res;
}
void dfs(int i, int j, int sum) {
// 使用 sum 来统计当前搜索的值的总和
sum += grid[i][j];
// 将 sum 值(当前搜索的值的总和)与结果 res 进行比较
res = Math.max(res, sum);
// 使用 temp (临时变量)来存储当前格子的值
int temp = grid[i][j];
// 将当前的格子置为 0 ,防止被再次搜索(根据题意,每次每个格子只能被搜索一次)
grid[i][j] = 0;
//访问四个方向
for (int[] d : dir) {
int xx = i + d[0], yy = j + d[1];
// 如果在金矿的范围之内,并且当前格子的值不为 0,则继续进行搜索
if (xx >= 0 && xx < m && yy < n && yy >= 0 && grid[xx][yy] > 0) {
// 继续进行搜索
dfs(xx, yy, sum);
}
}
// 将当前的格子的值置回原来最初的值
grid[i][j] = temp;
}
}