[leetcode] - 329. Longest Increasing Path in a Matrix

这道题目的意思是在一个矩阵中寻找递增的最长路径长度。一开始一直在纠结用set保存走过的点,然后进行递归深度搜索,结果一直超时。后面发现这是深坑,立马改变思路,用动态规划辅助后瞬间秒杀。

代码如下:

 public int longestIncreasingPath(int[][] matrix) {
        if(matrix.length == 0) return 0;
        int max = Integer.MIN_VALUE;

        int[][] map = new int[matrix.length][matrix[0].length];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                int res = countPath(matrix, map, Integer.MIN_VALUE, 0, i, j);
                max = Math.max(max, res);
            }
        }
        return max;
    }

    private int countPath(int[][] matrix, int[][] map, int pre, int len, int x, int y) {
        if(x < 0 || x == matrix.length || y < 0 || y == matrix[x].length) return len;
        int current = matrix[x][y];
        if(pre < current) {
            if(map[x][y] > 0) return map[x][y] + len;
            len++;
        }
        else return len;
        int left = countPath(matrix, map, current, len, x - 1, y);
        int right = countPath(matrix, map, current, len, x + 1, y);
        int bottom = countPath(matrix, map, current, len, x, y - 1);
        int top = countPath(matrix, map, current, len, x, y + 1);
        int res = Math.max(left, Math.max(right, Math.max(bottom, top)));
        map[x][y] = res - len + 1;
        return res;
    }

这里map用来保存已经算出来的当前坐标的最长路径,供后面的点直接计算答案,这样就可以减少重复计算了,map配合深度搜索就可以ac了。其实一开始我用set的思路是错的,根本没必要保存走过的路径,因为路径是递增的,下一个点必然比前一个点大,小于前一个点的点忽略就行了。

你可能感兴趣的:(算法)