原题链接
解题思路
刚开始想到了暴力遍历每一个数从头开始深度搜索。后面看了提示发现可以使用数组dp。
dp[i][j]表示以i行j列的数字为开头的最大长度。这样就可以把每个数字都记录下来(以空间换时间)。以免大量的重复。
总体思想就是dfs+dp。
解题代码
public class Solution {
private int m;
private int n;
private int[][] matrix;
private int[][] dp;
private static final int[][] directions = {
{1, 0},
{0, -1},
{-1, 0},
{0, 1}
};
public int longestIncreasingPath(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0) {
return 0;
}
m = matrix.length;
n = matrix[0].length;
this.matrix = matrix;
dp = new int[m][n];
int result = 1;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
result = Math.max(result, dfs(i, j));
}
}
return result;
}
private int dfs(int i, int j) {
if (dp[i][j] != 0) {
return dp[i][j];
}
int result = 1;
for (int[] direction : directions) {
int x = i + direction[0];
int y = j + direction[1];
if (x >= 0 && x < m && y >= 0 && y < n && matrix[i][j] < matrix[x][y]) {
result = Math.max(result, 1 + dfs(x, y));
}
}
dp[i][j] = result;
return result;
}
}