给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
class Solution {
public int longestIncreasingPath(int[][] matrix) {
int row = matrix.length;
if(row<1) return 0;
int col = matrix[0].length;
if(col<1) return 0;
int res = 0;
Map<String,Integer> map = new HashMap<String,Integer>();
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
int value = dfs(i,j,matrix,map);
res = Math.max(res,value);
}
}
return res;
}
public int dfs(int i, int j, int[][] matrix, Map<String,Integer> map){
if(map.containsKey(i+"_"+j)){
return map.get(i+"_"+j);
}
int row = matrix.length;
int col = matrix[0].length;
int res = 1;
int num1 = 0;
int num2 = 0;
int num3 = 0;
int num4 = 0;
if(i-1>=0 && j<col && matrix[i][j]<matrix[i-1][j]){//上方向
if(map.containsKey((i-1)+"_"+j)){
num1 = map.get((i-1)+"_"+j);
}else{
num1 = dfs(i-1,j,matrix,map);
}
}
if(i+1<row && j<col && matrix[i][j]<matrix[i+1][j]){//下方向
if(map.containsKey((i+1)+"_"+j)){
num2 = map.get((i+1)+"_"+j);
}else{
num2 = dfs(i+1,j,matrix,map);
}
}
if(i<row && j-1>=0 && matrix[i][j]<matrix[i][j-1]){//左方向
if(map.containsKey(i+"_"+(j-1))){
num3 = map.get(i+"_"+(j-1));
}else{
num3 = dfs(i,j-1,matrix,map);
}
}
if(i<row && j+1<col && matrix[i][j]<matrix[i][j+1]){//右方向
if(map.containsKey(i+"_"+(j+1))){
num4 = map.get(i+"_"+(j+1));
}else{
num4 = dfs(i,j+1,matrix,map);
}
}
int max = Math.max(num1,num2);
max = Math.max(max,num3);
max = Math.max(max,num4);
res = res+max;
map.put(i+"_"+j,res);
return res;
}
}