Native的DFS,TLE:
public int longestIncreasingPath(int[][] matrix) {
if(matrix==null||matrix.length==0||matrix[0].length==0)
return 0;
int[] max = new int[1];
for(int i=0; i<matrix.length; i++) {
for(int j=0; j<matrix[0].length; j++){
dfs(matrix, i, j, max, 1);
}
}
return max[0];
}
public void dfs(int[][] matrix, int i, int j, int[] max, int len){
max[0]=Math.max(max[0], len);
int m=matrix.length;
int n=matrix[0].length;
if(i + 1>=0 && i + 1<m && j>=0 && j<n && matrix[i + 1][j]>matrix[i][j]){
dfs(matrix, i + 1, j, max, len+1);
}
if(i - 1>=0 && i - 1<m && j>=0 && j<n && matrix[i - 1][j]>matrix[i][j]){
dfs(matrix, i - 1, j, max, len+1);
}
if(i>=0 && i<m && j + 1>=0 && j + 1<n && matrix[i][j + 1]>matrix[i][j]){
dfs(matrix, i, j + 1, max, len+1);
}
if(i>=0 && i<m && j - 1>=0 && j - 1<n && matrix[i][j - 1]>matrix[i][j]){
dfs(matrix, i, j - 1, max, len+1);
}
}
加上DP:
public int longestIncreasingPath(int[][] matrix) {
if(matrix==null||matrix.length==0||matrix[0].length==0)
return 0;
int[][] mem = new int[matrix.length][matrix[0].length];
int max=0;
for(int i=0; i<matrix.length; i++){
for(int j=0; j<matrix[0].length; j++){
max = Math.max(max, dfs(matrix, i, j, mem));
}
}
return max;
}
public int dfs(int[][] matrix, int i, int j, int[][] mem){
if(mem[i][j]!=0)
return mem[i][j];
if(i+1>=0&&j>=0&&i+1<matrix.length&&j<matrix[0].length&&matrix[i+1][j]>matrix[i][j]){
mem[i][j]=Math.max(mem[i][j], dfs(matrix, i+1, j, mem));
}
if(i-1>=0&&j>=0&&i-1<matrix.length&&j<matrix[0].length&&matrix[i-1][j]>matrix[i][j]){
mem[i][j]=Math.max(mem[i][j], dfs(matrix, i-1, j, mem));
}
if(i>=0&&j+1>=0&&i<matrix.length&&j+1<matrix[0].length&&matrix[i][j+1]>matrix[i][j]){
mem[i][j]=Math.max(mem[i][j], dfs(matrix, i, j+1, mem));
}
if(i>=0&&j-1>=0&&i<matrix.length&&j-1<matrix[0].length&&matrix[i][j-1]>matrix[i][j]){
mem[i][j]=Math.max(mem[i][j], dfs(matrix, i, j-1, mem));
}
return ++mem[i][j];
}
refer: http://www.programcreek.com/2014/05/leetcode-longest-increasing-path-in-a-matrix-java/