这道题目的意思是在一个矩阵中寻找递增的最长路径长度。一开始一直在纠结用set保存走过的点,然后进行递归深度搜索,结果一直超时。后面发现这是深坑,立马改变思路,用动态规划辅助后瞬间秒杀。
代码如下:
public int longestIncreasingPath(int[][] matrix) {
if(matrix.length == 0) return 0;
int max = Integer.MIN_VALUE;
int[][] map = new int[matrix.length][matrix[0].length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
int res = countPath(matrix, map, Integer.MIN_VALUE, 0, i, j);
max = Math.max(max, res);
}
}
return max;
}
private int countPath(int[][] matrix, int[][] map, int pre, int len, int x, int y) {
if(x < 0 || x == matrix.length || y < 0 || y == matrix[x].length) return len;
int current = matrix[x][y];
if(pre < current) {
if(map[x][y] > 0) return map[x][y] + len;
len++;
}
else return len;
int left = countPath(matrix, map, current, len, x - 1, y);
int right = countPath(matrix, map, current, len, x + 1, y);
int bottom = countPath(matrix, map, current, len, x, y - 1);
int top = countPath(matrix, map, current, len, x, y + 1);
int res = Math.max(left, Math.max(right, Math.max(bottom, top)));
map[x][y] = res - len + 1;
return res;
}
这里map用来保存已经算出来的当前坐标的最长路径,供后面的点直接计算答案,这样就可以减少重复计算了,map配合深度搜索就可以ac了。其实一开始我用set的思路是错的,根本没必要保存走过的路径,因为路径是递增的,下一个点必然比前一个点大,小于前一个点的点忽略就行了。