329.矩阵中的最长递增路径

329.矩阵中的最长递增路径

题解:

遍历计算出每一个格子的最长路径长度,用hashmap记录,避免重复计算
image-20200725212131652

class Solution {
    
    
    Map<Long, Integer> map = new HashMap<>();
    public int helper(int[][] matrix, int startX, int startY) {
    
    
        long key = (long) startX << 32 | startY;//计算以当前坐标为起点的组合键
        if (map.containsKey(key))        //如果当前答案已经计算过
            return map.get(key);
        int ans = 1;
        if (startX - 1 >= 0 && matrix[startX - 1][startY] > matrix[startX][startY])//向上
            ans = Math.max(ans, helper(matrix, startX - 1, startY) + 1);
        if (startX + 1 < matrix.length && matrix[startX + 1][startY] > matrix[startX][startY])//向下
            ans = Math.max(ans, helper(matrix, startX + 1, startY) + 1);
        if (startY - 1 >= 0 && matrix[startX][startY - 1] > matrix[startX][startY])//向左
            ans = Math.max(ans, helper(matrix, startX, startY - 1) + 1);
        if (startY + 1 < matrix[0].length && matrix[startX][startY + 1] > matrix[startX][startY])//向右
            ans = Math.max(ans, helper(matrix, startX, startY + 1) + 1);
        map.put(key, ans);//记录当前答案
        return ans;
    }
    public int longestIncreasingPath(int[][] matrix) {
    
    
        if(matrix.length==0) return 0; //空数组的处理
        int ans = Integer.MIN_VALUE;
        for (int i = 0; i < matrix.length; i++) {
    
       //遍历所有点为起点时的结果
            for (int j = 0; j < matrix[0].length; j++) {
    
    
                ans = Math.max(ans, helper(matrix, i, j));  //更新ans
            }
        }
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/Rush6666/article/details/107600946