BM61 题解 | #矩阵最长递增路径#
矩阵最长递增路径
https://www.nowcoder.com/practice/7a71a88cdf294ce6bdf54c899be967a2
阿哈时刻:
整体的思路,就是
1、用一个dp[i][j]二维数组来记录,当前这个格子能走多少步!
2、那怎么知道能走多少步呢,一个格子算一步,所有能走多少步dp[i][j] = 自己 + 四个方向能走的最大步数,也就是:
dp[i][j] = Math.max(dp[i][j], dp[nexti][nextj]+1); //这个是我通过思路,理解出来的!!!
看matrix的值,就知道了
比如,matrix是: [ [1,2,3], [4,5,6], [7,8,9] ] 那么,dp的值是 : [ [5,4,3], [4,3,2], [3,2,1] ]
3、最后,在遍历maxtrix的过程中顺便,记录dp[i][j]的最大值进行返回,就是目标值了。
import java.util.*; public class Solution { int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int n = 0, m = 0; public int dfs(int[][] matrix, int[][] dp, int i, int j) { if(dp[i][j] != 0) { return dp[i][j]; } dp[i][j]++; //一个格子算一步,如果没有走到这里就先赋值一步,再不断遍历 for(int k=0; k<4; k++) { int nexti = i + dirs[k][0]; int nextj = j + dirs[k][1]; if(nexti>=0 && nexti <n && nextj>=0 && nextj< m && matrix[nexti][nextj] > matrix[i][j] ) { dp[i][j] = Math.max(dp[i][j], dfs(matrix, dp, nexti, nextj)+1); } } return dp[i][j]; } /** * 递增路径的最大长度 * @param matrix int整型二维数组 描述矩阵的每个数 * @return int整型 */ public int solve (int[][] matrix) { if(matrix.length==0 || matrix[0].length==0) { return 0; } n = matrix.length; m = matrix[0].length; int[][] dp = new int[n][m]; int maxLen = 0; for(int i=0; i<n; i++) { for(int j=0; j<m; j++){ maxLen = Math.max(maxLen, dfs(matrix, dp, i, j)); } } String dps = Arrays.deepToString(dp); return maxLen; } }