leetcode329 https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix/

    本题只优化到记忆化搜索即可,对于严格位置以来比较复杂,无需优化。

    1. /**
    2. *
    3. *
    4. * 给定一个二维数组matrix,你可以从任何位置出发,走向上下左右四个方向
    5. * 返回能够走出来的最长的递增链长度。
    6. */
    7. public class Code05_LongestIncreasingPath {
    8. // 方式1: 暴力递归
    9. public static int longestIncreasingPath1(int[][] matrix) {
    10. int ans = 0;
    11. int N = matrix.length;
    12. int M = matrix[0].length;
    13. for (int i = 0; i < N; i++) {
    14. for (int j = 0; j < M; j++) {
    15. ans = Math.max(ans, process1(matrix, i, j));
    16. }
    17. }
    18. return ans;
    19. }
    20. // 从m[i][j]开始走,走出来的最长递增链,返回!
    21. public static int process1(int[][] m, int i, int j) {
    22. // base case
    23. if(i < 0 || i == m.length || j < 0 || j == m[0].length){
    24. return 0;
    25. }
    26. // 不越界 上下左右四个方向
    27. int up = i > 0 && m[i][j] < m[i - 1][j] ? process1(m, i - 1, j) : 0;
    28. int down = i < (m.length - 1) && m[i][j] < m[i + 1][j] ? process1(m, i + 1, j) : 0;
    29. int left = j > 0 && m[i][j] < m[i][j - 1] ? process1(m, i, j - 1) : 0;
    30. int right = j < (m[0].length - 1) && m[i][j] < m[i][j + 1] ? process1(m, i, j + 1) : 0;
    31. return Math.max(Math.max(up, down), Math.max(left, right)) + 1;
    32. }
    33. public static int longestIncreasingPath2(int[][] matrix) {
    34. int ans = 0;
    35. int N = matrix.length;
    36. int M = matrix[0].length;
    37. int[][] dp = new int[N][M];
    38. for (int i = 0; i < N; i++) {
    39. for (int j = 0; j < M; j++) {
    40. ans = Math.max(ans, process2(matrix, i, j, dp));
    41. }
    42. }
    43. return ans;
    44. }
    45. // 从m[i][j]开始走,走出来的最长递增链,返回!
    46. public static int process2(int[][] m, int i, int j, int[][] dp) {
    47. if (dp[i][j] != 0) {
    48. return dp[i][j];
    49. }
    50. // (i,j)不越界
    51. int up = i > 0 && m[i][j] < m[i - 1][j] ? process2(m, i - 1, j, dp) : 0;
    52. int down = i < (m.length - 1) && m[i][j] < m[i + 1][j] ? process2(m, i + 1, j, dp) : 0;
    53. int left = j > 0 && m[i][j] < m[i][j - 1] ? process2(m, i, j - 1, dp) : 0;
    54. int right = j < (m[0].length - 1) && m[i][j] < m[i][j + 1] ? process2(m, i, j + 1, dp) : 0;
    55. int ans = Math.max(Math.max(up, down), Math.max(left, right)) + 1;
    56. dp[i][j] = ans;
    57. return ans;
    58. }
    59. }