【Leetcode】1219. Path with Maximum Gold

题目地址:

https://leetcode.com/problems/path-with-maximum-gold/

给定一个 m m m n n n列的二维数组 A A A,题目保证只含非负整数。可以任选一个非零位置开始走,每次可以上下左右走一步,且不能走到 0 0 0或者走过的位置,问路径和最大是多少。

思路是DFS。枚举每个非 0 0 0位置,看能得到的最大路径和是多少。代码如下:

public class Solution {
     
    public int getMaximumGold(int[][] grid) {
     
        int res = 0, m = grid.length, n = grid[0].length;
        int[] d = {
     1, 0, -1, 0, 1};
        for (int i = 0; i < m; i++) {
     
            for (int j = 0; j < n; j++) {
     
                if (grid[i][j] == 0) {
     
                    continue;
                }
                
                // 枚举从一个非零位置开始走能得到的最大路径和
                res = Math.max(res, dfs(i, j, grid, new boolean[m][n], d));
            }
        }
        
        return res;
    }
    
    private int dfs(int x, int y, int[][] grid, boolean[][] visited, int[] d) {
     
        int sum = 0;
        visited[x][y] = true;
        
        // 枚举四个方向走,能得到的最大路径和
        for (int i = 0; i < 4; i++) {
     
            int nextX = x + d[i], nextY = y + d[i + 1];
            if (inBound(nextX, nextY, grid) && grid[nextX][nextY] != 0 && !visited[nextX][nextY]) {
     
                sum = Math.max(sum, dfs(nextX, nextY, grid, visited, d));
            }
        }
        
        // 回溯的时候要恢复现场
        visited[x][y] = false;
        return sum + grid[x][y];
    }
    
    private boolean inBound(int x, int y, int[][] grid) {
     
        return 0 <= x && x < grid.length && 0 <= y && y < grid[0].length;
    }
}

时间复杂度 O ( m n k ) O(mnk) O(mnk) k k k A A A中非零数的个数,空间 O ( m n ) O(mn) O(mn)

你可能感兴趣的:(#,DFS,BFS与图论,leetcode,dfs,算法,java)