Longest Increasing Path in a Matrix(Hard)

Given an integer matrix, find the length of the longest increasing path.

From each cell, you can either move to four directions: left, right, up or down. You may NOT move diagonally or move outside of the boundary (i.e. wrap-around is not allowed).

给出一个数字矩阵,寻找一条最长上升路径,每个位置只能向上下左右四个位置移动。

Example 1:

nums = [
  [9,9,4],
  [6,6,8],
  [2,1,1]
]
Return 4
The longest increasing path is [1, 2, 6, 9].

Example 2:

nums = [
  [3,4,5],
  [3,2,6],
  [2,2,1]
]
Return 4
The longest increasing path is [3, 4, 5, 6]. Moving diagonally is not allowed.
public static final int[][] dirs = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};

public int longestIncreasingPath(int[][] matrix) {
    if(matrix.length == 0) return 0;
    int rows = matrix.length, cols = matrix[0].length;
    int[][] cache = new int[rows][cols];
    int max = 1;
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < cols; j++) {
            int len = dfs(matrix, i, j, rows, cols, cache);
            max = Math.max(max, len);
        }
    }
    return max;
}

public int dfs(int[][] matrix, int i, int j, int rows, int cols, int[][] cache) {
    if(cache[i][j] != 0) return cache[i][j];
    int max = 1;
    for(int[] dir: dirs) {
        int x = i + dir[0];
        int y = j + dir[1];
        if(x < 0 || x >= rows || y < 0 || y >= cols || matrix[x][y] <= matrix[i][j]) 
           continue;
        int len = 1 + dfs(matrix, x, y, rows, cols, cache);
        max = Math.max(max, len);
    }
    cache[i][j] = max;
    return max;
}

From Here

results matching ""

    No results matching ""