题目大意:
黄金矿工
你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 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.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-1219-path-with-maximum-gold-解题思路分析/