X

LEETCODE 1219. Path with Maximum Gold 解题思路分析

题目大意:

黄金矿工

你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。

为了使收益最大化,矿工需要按以下规则来开采黄金:

  • 每当矿工进入一个单元,就会收集该单元格中的所有黄金。
  • 矿工每次可以从当前位置向上下左右四个方向走。
  • 每个单元格只能被开采(进入)一次。
  • 不得开采(进入)黄金数目为 0 的单元格。
  • 矿工可以从网格中 任意一个 有黄金的单元格出发或者是停止。

示例 1:

输入:grid = [[0,6,0],[5,8,7],[0,9,0]]
输出:24
解释:
[[0,6,0],
[5,8,7],
[0,9,0]]
一种收集最多黄金的路线是:9 -> 8 -> 7。

示例 2:

输入:grid = [[1,0,7],[2,0,6],[3,4,5],[0,3,0],[9,0,20]]
输出:28
解释:
[[1,0,7],
[2,0,6],
[3,4,5],
[0,3,0],
[9,0,20]]
一种收集最多黄金的路线是:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7。


如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1219

解题思路分析:

一道dfs深度优先搜索的题目。由于题目没有给出起点位置,因此我们需要以所有不为0的点为起点做dfs搜索,找到最大值即为答案。dfs的代码部分没有特别的技巧,属于典型dfs套路。

完整实现代码:

// 定义dfs可走的四个方向
int[][] directions = new int[][]{{0,1},{0,-1},{1,0},{-1,0}};
public int getMaximumGold(int[][] grid) {
    int res=0; // 返回结果
    for(int r=0;r<grid.length;r++){ // 循环二维数组的每个点
        for(int c=0;c<grid[0].length;c++){
            if(grid[r][c]>0){ // 如果改点的值大于0
                // dfs得到一个结果,并与最大值比较
                res = Math.max(res, dfs(grid, r, c));
            }
        }
    }
    return res;
}

public int dfs(int[][] grid, int row, int col) {
    int current = grid[row][col]; // 当前位置的值
    grid[row][col] = 0; // 避免走回头路,将当前位置的值变为0
    int max=0; // dfs返回结果
    for(int[] direction : directions){ // 循环向4个方向走一步
        // 得到下一个点的坐标
        int nextRow=row+direction[0], nextCol=col+direction[1];
        // 如果下一个点的坐标在矩阵范围内且不为0,则向下dfs
        if(nextRow>=0 && nextRow<grid.length
           &&nextCol>=0 && nextCol<grid[0].length
           &&grid[nextRow][nextCol] != 0){
            // 得到一个最大的dfs值
            max = Math.max(max, dfs(grid, nextRow, nextCol));
        }
    }
    // 将当前点的值还原(不还原的话会影响其他dfs线路的计算)
    grid[row][col] = current;
    return max+current // 返回dfs最大值加上当前点的数值;
}

本题解法执行时间为16ms。

Runtime: 16 ms, faster than 61.97% of Java online submissions for Path with Maximum Gold.

Memory Usage: 34.5 MB, less than 100.00% of Java online submissions for Path with Maximum Gold.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1219-path-with-maximum-gold-解题思路分析/
Categories: leetcode
kwantong: