LeetCode-329. 矩阵中的最长递增路径

不念不忘少年蓝@ 2024-03-29 15:52 178阅读 0赞

题目来源
329. 矩阵中的最长递增路径

暴力递归

  1. public static int longestIncreasingPath1(int[][] matrix) {
  2. int ans = 0;
  3. int N = matrix.length;
  4. int M = matrix[0].length;
  5. for (int i = 0; i < N; i++) {
  6. for (int j = 0; j < M; j++) {
  7. ans = Math.max(ans, process1(matrix, i, j));
  8. }
  9. }
  10. return ans;
  11. }
  12. // 从m[i][j]开始走,走出来的最长递增链,返回!
  13. public static int process1(int[][] m, int i, int j) {
  14. int up = i > 0 && m[i][j] < m[i - 1][j] ? process1(m, i - 1, j) : 0;
  15. int down = i < (m.length - 1) && m[i][j] < m[i + 1][j] ? process1(m, i + 1, j) : 0;
  16. int left = j > 0 && m[i][j] < m[i][j - 1] ? process1(m, i, j - 1) : 0;
  17. int right = j < (m[0].length - 1) && m[i][j] < m[i][j + 1] ? process1(m, i, j + 1) : 0;
  18. return Math.max(Math.max(up, down), Math.max(left, right)) + 1;
  19. }

会发现答案是正确,我们就要继续优化
在这里插入图片描述

暴力递归加缓存

定义一个dp

  1. public static int longestIncreasingPath2(int[][] matrix) {
  2. int ans = 0;
  3. int N = matrix.length;
  4. int M = matrix[0].length;
  5. int[][] dp = new int[N][M];
  6. for (int i = 0; i < N; i++) {
  7. for (int j = 0; j < M; j++) {
  8. ans = Math.max(ans, process2(matrix, i, j, dp));
  9. }
  10. }
  11. return ans;
  12. }
  13. // 从m[i][j]开始走,走出来的最长递增链,返回!
  14. public static int process2(int[][] m, int i, int j, int[][] dp) {
  15. if (dp[i][j] != 0) {
  16. return dp[i][j];
  17. }
  18. // (i,j)不越界
  19. int up = i > 0 && m[i][j] < m[i - 1][j] ? process2(m, i - 1, j, dp) : 0;
  20. int down = i < (m.length - 1) && m[i][j] < m[i + 1][j] ? process2(m, i + 1, j, dp) : 0;
  21. int left = j > 0 && m[i][j] < m[i][j - 1] ? process2(m, i, j - 1, dp) : 0;
  22. int right = j < (m[0].length - 1) && m[i][j] < m[i][j + 1] ? process2(m, i, j + 1, dp) : 0;
  23. int ans = Math.max(Math.max(up, down), Math.max(left, right)) + 1;
  24. dp[i][j] = ans;
  25. return ans;
  26. }

在这里插入图片描述

发表评论

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

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

相关阅读