0
点赞
收藏
分享

微信扫一扫

LeetCode 1725. 可以形成最大正方形的矩形数目题解

王老师说 2022-02-05 阅读 52

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;
    }
}
举报

相关推荐

0 条评论