/**^**/一开始写的朴素递归。。把max引用传进函数去,最后只返回一个max,但时间超时,虽然逻辑没问题。。看了题解emmm,明白了是备忘录递归法,但基于我这种原始代码改的还麻烦,之前返回void,备忘录的话得返回每个节点得值,好吧,直接贴官方代码。总是一看就懂。。。气死
1 class Solution { 2 public: 3 static constexpr int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; 4 int rows, columns; 5 6 int longestIncreasingPath(vector< vector<int> > &matrix) { 7 if (matrix.size() == 0 || matrix[0].size() == 0) { 8 return 0; 9 } 10 rows = matrix.size(); 11 columns = matrix[0].size(); 12 auto memo = vector< vector<int> > (rows, vector <int> (columns)); 13 int ans = 0; 14 for (int i = 0; i < rows; ++i) { 15 for (int j = 0; j < columns; ++j) { 16 ans = max(ans, dfs(matrix, i, j, memo)); 17 } 18 } 19 return ans; 20 } 21 22 int dfs(vector< vector<int> > &matrix, int row, int column, vector< vector<int> > &memo) {//返回以每个坐标点开始的最长路径 23 if (memo[row][column] != 0) { //备忘录 24 return memo[row][column]; 25 } 26 ++memo[row][column]; 27 for (int i = 0; i < 4; ++i) { 28 int newRow = row + dirs[i][0], newColumn = column + dirs[i][1]; 29 if (newRow >= 0 && newRow < rows && newColumn >= 0 && newColumn < columns && matrix[newRow][newColumn] > matrix[row][column]) { 30 memo[row][column] = max(memo[row][column], dfs(matrix, newRow, newColumn, memo) + 1); //四个方向的max 31 } 32 } 33 return memo[row][column]; 34 } 35 };