leetcode 329. Longest Increasing Path in a Matrix 矩阵中寻找最长递增序列 + 一个典型的深度优先遍历DFS的做法

不念不忘少年蓝@ 2022-06-07 01:10 243阅读 0赞

Given an integer matrix, find the length of the longest increasing path.

From each cell, you can either move to four directions: left, right, up or down. You may NOT move diagonally or move outside of the boundary (i.e. wrap-around is not allowed).

Example 1:

nums = [
[9,9,4],
[6,6,8],
[2,1,1]
]
Return 4
The longest increasing path is [1, 2, 6, 9].

Example 2:

nums = [
[3,4,5],
[3,2,6],
[2,2,1]
]
Return 4
The longest increasing path is [3, 4, 5, 6]. Moving diagonally is not allowed.

这道题很简单,直接DFS遍历即可,不过这里使用了一个dp数组来做剪纸处理,属于一个很基本的DFS深度有限遍历的应用。

需要注意的地方是,我们我们把一个前一个元素的值作为比较的值,这里的递增是严格递增,

DFS的做法很不错,和这一道题leetcode 375. Guess Number Higher or Lower II 按照length动态规划DP + 最大最小化问题的做法很相似,建议一起学习

代码如下:

  1. /*
  2. * 没什么就是一个简单的最基本的DFS深度优先遍历的应用
  3. * */
  4. class Solution
  5. {
  6. public int longestIncreasingPath(int[][] matrix)
  7. {
  8. if(matrix.length<=0 || matrix[0].length <=0)
  9. return 0;
  10. int max=0, n = matrix.length, m = matrix[0].length;
  11. int [][] dp = new int[n][m];
  12. for(int i=0;i<matrix.length;i++)
  13. {
  14. for(int j=0;j<matrix[0].length;j++)
  15. {
  16. max = Math.max(max, maxLen(matrix, Integer.MIN_VALUE, i, j, dp));
  17. }
  18. }
  19. return max;
  20. }
  21. public int maxLen(int[][] matrix, int pre, int i, int j, int[][] dp)
  22. {
  23. if(i<0 || j<0 || i>=matrix.length || j>= matrix[0].length || matrix[i][j] <= pre)
  24. return 0;
  25. else if(dp[i][j] != 0)
  26. return dp[i][j];
  27. else
  28. {
  29. pre = matrix[i][j];
  30. int up = maxLen(matrix, pre, i-1, j, dp) + 1;
  31. int left = maxLen(matrix, pre, i, j-1, dp) + 1;
  32. int right = maxLen(matrix, pre, i, j+1, dp) + 1;
  33. int down = maxLen(matrix, pre, i+1, j, dp) + 1;
  34. dp[i][j] = Math.max(up, Math.max(left, Math.max(right,down)));
  35. return dp[i][j];
  36. }
  37. }
  38. }

下面是C++的做法,

代码如下:

  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <unordered_map>
  5. #include <set>
  6. #include <unordered_set>
  7. #include <queue>
  8. #include <stack>
  9. #include <string>
  10. #include <climits>
  11. #include <algorithm>
  12. #include <sstream>
  13. #include <functional>
  14. #include <bitset>
  15. #include <numeric>
  16. #include <cmath>
  17. #include <regex>
  18. using namespace std;
  19. class Solution
  20. {
  21. public:
  22. int longestIncreasingPath(vector<vector<int>>& mat)
  23. {
  24. if (mat.size() <= 0)
  25. return 0;
  26. int row = mat.size() , col = mat[0].size();
  27. vector<vector<int>> dp(row, vector<int>(col, 0));
  28. int res = 0;
  29. for (int i = 0; i < row; i++)
  30. {
  31. for (int j = 0; j < col; j++)
  32. {
  33. int one = dfs(mat, dp, INT_MIN, i, j);
  34. res = max(res, one);
  35. }
  36. }
  37. return res;
  38. }
  39. int dfs(vector<vector<int>>& mat, vector<vector<int>>& dp, int pre, int x, int y)
  40. {
  41. int row = mat.size(), col = mat[0].size();
  42. if (x < 0 || x >= row || y<0 || y >= col || pre >= mat[x][y])
  43. return 0;
  44. else if (dp[x][y] != 0)
  45. return dp[x][y];
  46. else
  47. {
  48. pre = mat[x][y];
  49. int left = dfs(mat, dp, pre, x - 1, y) + 1;
  50. int right = dfs(mat, dp, pre, x + 1, y) + 1;
  51. int up = dfs(mat, dp, pre, x, y + 1) + 1;
  52. int down = dfs(mat, dp, pre, x, y - 1) + 1;
  53. dp[x][y] = max(left, max(right, max(up, down)));
  54. return dp[x][y];
  55. }
  56. }
  57. };

发表评论

表情:
评论列表 (有 0 条评论,243人围观)

还没有评论,来说两句吧...

相关阅读