题目
给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。
示例 1:
输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4
解释:最长递增路径为 [1, 2, 6, 9]。
分析
1.当一个格子的值大于等于它周围所有格子的值时,以该格子为起点的最长递增路径的长度为1;
2.以格子A为起点的最长递增路径的长度 = 周围大于A的值的格子中最大的最长路径+1;
3.计算并记录二维数组中每个格子以自己为起点的最长递增路径的长度;
4.比较以每个格子为起点的最长路径的值,返回结果。
代码
class Solution {
public int longestIncreasingPath(int[][] matrix) {
int line = matrix.length;
int column = matrix[0].length;
int[][] greater = new int[line][column];//记录以当前格子为起点的最长递增路径的长度
for (int i=0;i<line;i++){
for(int j=0;j<column;j++){
greater[i][j] = -1;//初始化数组
}
}
int maxLength =0;//比较记录最大值,用来返回结果
for (int i=0;i<line;i++){
for(int j=0;j<column;j++){
greater[i][j] = getGreater(matrix,i,j,line,column,greater);
if(greater[i][j]>maxLength){
maxLength = greater[i][j];
}
}
}
return maxLength;
}
private int getGreater(int[][] matrix , int i, int j,int line, int column ,int[][] greater ){
int up =0;
int down =0;
int left =0;
int right = 0;
if(greater[i][j]>=0){//如果该点已经计算过最长路径,直接返回结果
return greater[i][j];
}
else {
if(i-1>=0 && matrix[i][j]<matrix[i-1][j]){//上
up = getGreater(matrix,i-1,j,line,column,greater);
greater[i-1][j] =up;
}
if(i+1<line && matrix[i][j]<matrix[i+1][j]){//下
down = getGreater(matrix,i+1,j,line,column,greater);
greater[i+1][j] =down;
}
if (j-1>=0 && matrix[i][j]<matrix[i][j-1]){//左
left = getGreater(matrix,i,j-1,line,column,greater);
greater[i][j-1] =left;
}
if (j+1<column && matrix[i][j]<matrix[i][j+1]){//右
right = getGreater(matrix,i,j+1,line,column,greater);
greater[i][j+1] =right;
}
}
return Math.max(Math.max(up,down),Math.max(left,right))+1;//返回结果:最大值+1
}
}