
感觉上这一题是hard里面比较easy的。基本上就是一个带cache的dfs。建立一个result数组,result[i][j]代表了(i, j)为起点的Longest Increasing Path的长度,0表示还未被遍历过。循环遍历input数组,如果result数组里对应的位置是0,就从那点开始dfs。dfs的做法是
1. 上下左右不停延伸
2. 如果延伸到的点比之前的点数值小,dfs就原地返回 0 表示走不下去了。
3. 否则,如果 a.当前的result[i][j]初始化过,就直接返回result[i][j]。b.没初始化过就以当前点为dfs的节点继续dfs
4. 当前点的结果就是四个方向返回值中最大的加一。
之所以result可以一方面的作为result的cache,另一方面的作为dfs的遍历过的点的记录的原因是因为这一题本身的特质就可以防止dfs走回头路(因为是longest increasing,所以要走的点一定比自己大,走过的点一定比自己小)。
根据上面算法的描述,可以得到代码如下:
static int[][] DIR = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public int longestIncreasingPath(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) return 0;
int[][] resultArr = new int[matrix.length][matrix[0].length];
int result = 0;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (resultArr[i][j] == 0) {
dfs(resultArr, matrix, i, j, Integer.MIN_VALUE);
}
result = Math.max(result, resultArr[i][j]);
}
}
return result;
}
public int dfs(int[][] resultArr, int[][] matrix, int i, int j, int prev) {
if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length || matrix[i][j] <= prev) {
return 0;
}
if (resultArr[i][j] != 0) {
return resultArr[i][j];
}
for (int[] dir : DIR) {
resultArr[i][j] = Math.max(resultArr[i][j], dfs(resultArr, matrix, i + dir[0], j + dir[1], matrix[i][j]) + 1);
}
return resultArr[i][j];
}
本文解析了一种求解二维矩阵中最长递增路径的算法。通过使用带缓存的深度优先搜索(DFS),并结合动态规划思想,有效避免重复计算,显著提高效率。文章详细阐述了算法步骤,并附带具体代码实现。
355

被折叠的 条评论
为什么被折叠?



