leetcode329 https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix/
本题只优化到记忆化搜索即可,对于严格位置以来比较复杂,无需优化。
/***** 给定一个二维数组matrix,你可以从任何位置出发,走向上下左右四个方向* 返回能够走出来的最长的递增链长度。*/public class Code05_LongestIncreasingPath {// 方式1: 暴力递归public static int longestIncreasingPath1(int[][] matrix) {int ans = 0;int N = matrix.length;int M = matrix[0].length;for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {ans = Math.max(ans, process1(matrix, i, j));}}return ans;}// 从m[i][j]开始走,走出来的最长递增链,返回!public static int process1(int[][] m, int i, int j) {// base caseif(i < 0 || i == m.length || j < 0 || j == m[0].length){return 0;}// 不越界 上下左右四个方向int up = i > 0 && m[i][j] < m[i - 1][j] ? process1(m, i - 1, j) : 0;int down = i < (m.length - 1) && m[i][j] < m[i + 1][j] ? process1(m, i + 1, j) : 0;int left = j > 0 && m[i][j] < m[i][j - 1] ? process1(m, i, j - 1) : 0;int right = j < (m[0].length - 1) && m[i][j] < m[i][j + 1] ? process1(m, i, j + 1) : 0;return Math.max(Math.max(up, down), Math.max(left, right)) + 1;}public static int longestIncreasingPath2(int[][] matrix) {int ans = 0;int N = matrix.length;int M = matrix[0].length;int[][] dp = new int[N][M];for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {ans = Math.max(ans, process2(matrix, i, j, dp));}}return ans;}// 从m[i][j]开始走,走出来的最长递增链,返回!public static int process2(int[][] m, int i, int j, int[][] dp) {if (dp[i][j] != 0) {return dp[i][j];}// (i,j)不越界int up = i > 0 && m[i][j] < m[i - 1][j] ? process2(m, i - 1, j, dp) : 0;int down = i < (m.length - 1) && m[i][j] < m[i + 1][j] ? process2(m, i + 1, j, dp) : 0;int left = j > 0 && m[i][j] < m[i][j - 1] ? process2(m, i, j - 1, dp) : 0;int right = j < (m[0].length - 1) && m[i][j] < m[i][j + 1] ? process2(m, i, j + 1, dp) : 0;int ans = Math.max(Math.max(up, down), Math.max(left, right)) + 1;dp[i][j] = ans;return ans;}}
