当前位置:   article > 正文

leetcode 329.矩阵中的最长递增路径_dfs最长路径问题

dfs最长路径问题

给定一个整数矩阵,找出最长递增路径的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

示例 1:

输入: nums = 
[
  [9,9,4],
  [6,6,8],
  [2,1,1]
] 
输出: 4 
解释: 最长递增路径为 [1, 2, 6, 9]

示例 2:

输入: nums = 
[
  [3,4,5],
  [3,2,6],
  [2,2,1]
] 
输出: 4 
解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。

 

思路:

1.普通的DFS 超时!

2.带记忆的DFS搜索  保存已经访问过的节点的结果,下次经过该点时,直接使用,避免重复计算。

类似与动态规划,不同的是,动态规划自底向上计算保存历史值,记忆化搜索自顶向下计算保存历史值。

 

1.普通的DFS 超时!

  1. class Solution {
  2. public int longestIncreasingPath(int[][] matrix) {
  3. int m=matrix.length;
  4. if(m==0) return 0;
  5. int n=matrix[0].length;
  6. int maxLength=0;
  7. for(int i=0;i<m;i++){
  8. for(int j=0;j<n;j++){
  9. int temp=dfs(matrix,i,j,1);
  10. maxLength=maxLength>temp?maxLength:temp;
  11. }
  12. }
  13. return maxLength;
  14. }
  15. public int dfs(int[][] matrix,int i,int j,int count){
  16. // 由于走的是递增路径,不会存在重复访问情况
  17. int m=matrix.length;
  18. int n=matrix[0].length;
  19. int maxLength=count;
  20. if(j>0 && matrix[i][j-1]>matrix[i][j]) maxLength=Math.max(maxLength,dfs(matrix,i,j-1,count+1));
  21. if(j<n-1 && matrix[i][j+1]>matrix[i][j]) maxLength=Math.max(maxLength,dfs(matrix,i,j+1,count+1));
  22. if(i>0 && matrix[i-1][j]>matrix[i][j]) maxLength=Math.max(maxLength,dfs(matrix,i-1,j,count+1));
  23. if(i<m-1 && matrix[i+1][j]>matrix[i][j]) maxLength=Math.max(maxLength,dfs(matrix,i+1,j,count+1));
  24. return maxLength;
  25. }
  26. }

2.记忆化搜索

保存已经访问过的节点的结果,下次经过该点时,直接使用,避免重复计算。

  1. class Solution {
  2. public int longestIncreasingPath(int[][] matrix) {
  3. if(matrix==null) return 0;
  4. int m=matrix.length;
  5. if(m==0) return 0;
  6. int n=matrix[0].length;
  7. int maxLength=0;
  8. // 保存从该点出发的最长路径
  9. int[][] dp=new int[m][n];
  10. for(int i=0;i<m;i++){
  11. for(int j=0;j<n;j++){
  12. int temp=dfs(matrix,i,j,dp);
  13. if(maxLength<temp) maxLength=temp;
  14. }
  15. }
  16. return maxLength;
  17. }
  18. public int dfs(int[][] matrix,int i,int j,int[][] dp){
  19. // 由于走的是递增路径,不会存在重复访问情况
  20. // 若该点访问过,直接返回记忆的值
  21. if(dp[i][j]!=0) return dp[i][j];
  22. int m=matrix.length;
  23. int n=matrix[0].length;
  24. int maxLength=0;
  25. if(j>0 && matrix[i][j-1]>matrix[i][j]) {
  26. maxLength=Math.max(maxLength,dfs(matrix,i,j-1,dp));
  27. }
  28. if(j<n-1 && matrix[i][j+1]>matrix[i][j]) {
  29. maxLength=Math.max(maxLength,dfs(matrix,i,j+1,dp));
  30. }
  31. if(i>0 && matrix[i-1][j]>matrix[i][j]) {
  32. maxLength=Math.max(maxLength,dfs(matrix,i-1,j,dp));
  33. }
  34. if(i<m-1 && matrix[i+1][j]>matrix[i][j]) {
  35. maxLength=Math.max(maxLength,dfs(matrix,i+1,j,dp));
  36. }
  37. dp[i][j]=maxLength+1;
  38. return dp[i][j];
  39. }
  40. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/967916
推荐阅读
相关标签
  

闽ICP备14008679号