当前位置:   article > 正文

LeetCode329. 矩阵中的最长递增路径

LeetCode329. 矩阵中的最长递增路径

给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。

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

思路:使用深度优先搜索(DFS)来寻找最长递增路径;

一开始的做法,导致超出时间限制,因为每个节点有四个方向可以遍历,这样导致有大量的重复计算,矩阵越大,重复计算量越多!为了减少时间复杂度,可以使用(DP)table 来进行记忆化存储,显著提高了算法效率!!!

代码:

  1. public class Solution {
  2. public int longestIncreasingPath(int[][] matrix) {
  3. if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
  4. return 0;
  5. }
  6. int rows = matrix.length;
  7. int cols = matrix[0].length;
  8. int[][] dp = new int[rows][cols];
  9. int maxLength = 0;
  10. for (int i = 0; i < rows; i++) {
  11. for (int j = 0; j < cols; j++) {
  12. maxLength = Math.max(maxLength, dfs(matrix, dp, i, j, -1));
  13. }
  14. }
  15. return maxLength;
  16. }
  17. private int dfs(int[][] matrix, int[][] dp, int x, int y, int prevVal) {
  18. if (x < 0 || x >= matrix.length || y < 0 || y >= matrix[0].length || matrix[x][y] <= prevVal) {
  19. return 0;
  20. }
  21. if (dp[x][y] != 0) { // 如果已经计算过,则直接返回结果
  22. return dp[x][y];
  23. }
  24. int length = 1;// 当前位置至少可以构成长度为1的路径
  25. // 递归地探索四个方向
  26. int l1 = dfs(matrix, dp, x + 1, y, matrix[x][y]);
  27. int l2 = dfs(matrix, dp, x - 1, y, matrix[x][y]);
  28. int l3 = dfs(matrix, dp, x , y+1, matrix[x][y]);
  29. int l4 = dfs(matrix, dp, x, y-1, matrix[x][y]);
  30. int res = Math.max(Math.max(l1, l2),Math.max(l3, l4)) + length;
  31. dp[x][y] = res; // 存储结果以便后续使用
  32. return res;
  33. }
  34. }

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

闽ICP备14008679号