思路
记忆化深搜
记录每个点的最长距离:
- 如果搜索到该点发现该点没有值,则该点记录为1
- 如果搜索到该点发现有值,则该值为搜索到点的最长路径,则在该值基础上加1即可
顺序遍历
代码
public class Solution {
// 备忘录
int[][] memo;
public int longestIncreasingPath(int[][] matrix) {
if (null == matrix || matrix.length == 0
|| null == matrix[0] || matrix[0].length == 0) {
return 0;
}
memo = new int[matrix.length][matrix[0].length];
int res = 1;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
res = Math.max(dfs(matrix, i, j, Integer.MIN_VALUE), res);
}
}
return res;
}
// 深搜
public int dfs(int[][] matrix, int i, int j, int val) {
if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[i].length) {
return 0;
}
if (matrix[i][j] <= val) {
return 0;
}
if (memo[i][j] != 0) {
return memo[i][j];
}
// 能走到这,先初始化1
memo[i][j] = 1;
int top = dfs(matrix, i + 1, j, matrix[i][j]);
int bottom = dfs(matrix, i - 1, j, matrix[i][j]);
int right = dfs(matrix, i, j + 1, matrix[i][j]);
int left = dfs(matrix, i, j - 1, matrix[i][j]);
// 记忆该点最长距离
memo[i][j] = Math.max(Math.max(top, bottom), Math.max(right, left)) + 1;
return memo[i][j];
}
}