329:给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。
class Solution {
private int[][] memo;
private int[][] matrix;
public int longestIncreasingPath(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
this.memo = new int[m][n];
this.matrix = matrix;
int maxLength = Integer.MIN_VALUE;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(memo[i][j]!=0){
continue;
}
//若遇到没有遍历过的位置,由于没有上一个值,需要手动向四周扩散
int val = matrix[i][j];
int left = dfs(matrix,i,j-1,val);
int right = dfs(matrix,i,j+1,val);
int up = dfs(matrix,i-1,j,val);
int down = dfs(matrix,i+1,j,val);
//到达当前位置的最长距离,即挑选四周最长的长度,并且挑选四周中比自己小的
memo[i][j] = Math.max(Math.max(left,right),Math.max(up,down))+1;
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
maxLength = Math.max(maxLength,memo[i][j]);
}
}
return maxLength;
}
public int dfs(int[][] matrix,int row,int col,int lastNum){
//越界
if(row<0||row>matrix.length-1||col<0||col>matrix[0].length-1){
return 0;
}
//如果比上一个值大,终止
if(matrix[row][col]>=lastNum){
return 0;
}
if(memo[row][col]!=0){
return memo[row][col];
}
int val = matrix[row][col];
//四周遍历
int left = dfs(matrix,row,col-1,val);
int right = dfs(matrix,row,col+1,val);
int up = dfs(matrix,row-1,col,val);
int down = dfs(matrix,row+1,col,val);
//到达当前位置的最长距离,即挑选四周最长的长度,并且挑选四周中比自己小的
memo[row][col] = Math.max(Math.max(left,right),Math.max(up,down))+1;
return memo[row][col];
}
}