【问题标题】:Recursion Longest Increasing Path in matrix矩阵中的递归最长增加路径
【发布时间】:2020-03-06 03:29:28
【问题描述】:

我正在实现 leetcode 的最长递增路径问题。

给定一个整数矩阵,求最长递增路径的长度。

您可以从每个单元格移动到四个方向:左、右、上或下。您不得沿对角线移动或移出边界(即不允许环绕)。

示例 1:

输入:nums = [ [9,9,4], [6,6,8], [2,1,1] ] 输出:4 解释:最长的递增路径是[1, 2, 6, 9]。

所以下面是我的实现尝试了很多递归,但无法理解为什么它没有给出正确的结果,为什么 maxDist 在这个例子中从 4 减少到 3 到 2,因为这个变量是全局的而不是局部的。

public class LongestIncreasingPath {

    private static final int[][] dirs = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
    private int m, n;
    int maxDist;

    public int longestIncreasingPath(int[][] matrix) {
        if (matrix.length == 0)
            return 0;
        m = matrix.length;
        n = matrix[0].length;
        int ans = 1;
        for (int i = 0; i < m; ++i)
            for (int j = 0; j < n; ++j) {
                dfs(matrix, i, j, 1);
                ans = Math.max(ans, maxDist);
            }
        return ans;
    }
    private int dfs(int[][] matrix, int i, int j, int dist) {
        for (int[] d : dirs) {
            int x = i + d[0], y = j + d[1];
            if (0 <= x && x < m && 0 <= y && y < n && matrix[x][y] > matrix[i][j]) {
                maxDist = Math.max(maxDist, dfs(matrix, x, y, dist+1));
            }
        }
        return dist;
    }

    public static void main(String[] args) {
        int[][] nums = { { 9, 9, 4 }, { 6, 6, 8 }, { 2, 1, 1 } };
        LongestIncreasingPath lIP = new LongestIncreasingPath();
        System.out.println(lIP.longestIncreasingPath(nums));
    }
}

【问题讨论】:

    标签: java recursion depth-first-search


    【解决方案1】:

    以下是一个工作版本,在 2 个测试用例上进行了测试(仅)。请注意 cmets 关于 bug 和结构的一些变化:

    public class LongestIncreasingPath {
    
        private static final int[][] dirs = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };
        private int rows, cols;
        //avoid non-volatile class variable that may be updated by more than one thread
        //use local variables instead
        //private int maxDist;
    
        public int longestIncreasingPath(int[][] matrix) {
            if (matrix.length == 0) return 0;
            rows = matrix.length;
            cols = matrix[0].length;
    
            int maxDist = 0; //retain max found
            for (int row = 0; row < rows; ++row) {
                for (int col = 0; col < cols; ++col) {
                    //bug fix: use distance (matrix[row][col]) instead of 1
                    int  distance = dfs(matrix, row, col, matrix[row][col]);
                    maxDist = Math.max(distance, maxDist);
                }
            }
            return maxDist;
        }
    
        private int dfs(int[][] matrix, int row, int newCol, int dist) {
    
            int maxDist = dist; 
            for (int[]dir : dirs) {
                int newRow = row + dir[0], y = newCol + dir[1];
                if (0 <= newRow && newRow < rows && 0 <= y && y < cols &&
                                            matrix[newRow][y] > matrix[row][newCol]) {
                    //bug fix: //add new distance matrix[x][y] instead of 1
                    maxDist = Math.max(maxDist, dfs(matrix, newRow, y, dist + matrix[newRow][y]));
                }
            }
            return maxDist;
        }
    
        public static void main(String[] args) {
    
            LongestIncreasingPath lIP = new LongestIncreasingPath();
            int[][] nums = { { 9, 9, 4 },
                             { 6, 6, 8 },
                             { 2, 2, 1 }
                            };
            //printout test case 1
            System.out.println(lIP.longestIncreasingPath(nums));
            nums = new int[][]{ { 5, 6, 7 },
                                { 4, 9, 8 },
                                { 3, 2, 1 }
                            };
            //printout test case 2
            System.out.println(lIP.longestIncreasingPath(nums));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      相关资源
      最近更新 更多