Given an m x n integers matrix, return the length of the longest increasing path inmatrix.
From each cell, you can either move in four directions: left, right, up, or down. You may not move diagonally or move outside the boundary (i.e., wrap-around is not allowed).
Example 1:
**Input:** matrix = [[9,9,4],[6,6,8],[2,1,1]]
**Output:** 4
**Explanation:** The longest increasing path is [1, 2, 6, 9].
Example 2:
**Input:** matrix = [[3,4,5],[3,2,6],[2,2,1]]
**Output:** 4
**Explanation:** The longest increasing path is [3, 4, 5, 6]. Moving diagonally is not allowed.
Example 3:
**Input:** matrix = [[1]]
**Output:** 1
Constraints:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 200
0 <= matrix[i][j] <= 231 - 1
ac: DFS + Memorization
classSolution {publicintlongestIncreasingPath(int[][] matrix) {// edge caseif (matrix ==null||matrix.length==0|| matrix[0].length==0) return0;int row =matrix.length, col = matrix[0].length, lgst =0;int[][] visited =newint[row][col];for (int r =0; r < row; r++) {for (int c =0; c < col; c++) {int tmp =dfs(matrix, r, c, visited, matrix[r][c]-1); lgst =Math.max(lgst, tmp); } }return lgst; }privateintdfs(int[][] matrix,int r,int c,int[][] visited,int last) {// exitif (r <0|| r >=matrix.length|| c <0|| c >= matrix[0].length) return0; // out of boundaryif (matrix[r][c] <= last) return0; // not increasingif (visited[r][c] >0) return visited[r][c]; // processed before, has result// process visited[r][c] =Math.max(visited[r][c],dfs(matrix, r+1, c, visited, matrix[r][c])+1); visited[r][c] =Math.max(visited[r][c],dfs(matrix, r-1, c, visited, matrix[r][c])+1); visited[r][c] =Math.max(visited[r][c],dfs(matrix, r, c+1, visited, matrix[r][c])+1); visited[r][c] =Math.max(visited[r][c],dfs(matrix, r, c-1, visited, matrix[r][c])+1);return visited[r][c]; }}
use dirs technique in a matrix, but I think my original solution above is more intuitive.