1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Solution { private static final int[][] DIRECTIONS = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
public int longestIncreasingPath(int[][] matrix) { int m = matrix.length, n = matrix[0].length;
int[][] memo = new int[m][n]; int maxLength = 1; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { maxLength = Math.max(maxLength, dfs(matrix, memo, i, j)); } }
return maxLength; }
private int dfs(int[][] matrix, int[][] memo, int i, int j) { int m = matrix.length, n = matrix[0].length; if (memo[i][j] != 0) { return memo[i][j]; }
int maxLength = 1; for (int[] direction : DIRECTIONS) { int nextI = i + direction[0], nextJ = j + direction[1]; if (nextI >= 0 && nextI < m && nextJ >= 0 && nextJ < n && matrix[i][j] < matrix[nextI][nextJ]) { maxLength = Math.max(maxLength, 1 + dfs(matrix, memo, nextI, nextJ)); } }
memo[i][j] = maxLength; return maxLength; } }
|