题目
329. 矩阵中的最长递增路径
我的思路
我的思路与官方题解法一大同小异。
深搜+记忆化
使用一个同规格大小的memoryMatrix矩阵存储对应位置单元格作为起点的最大递增路径长度。
我的实现
class Solution { public: int search(int cor_x,int cor_y,vector<vector<int>>& matrix,vector<vector<int>>& memoryMatrix){ //递归终止的条件:1.当前方格已被搜索过,记忆矩阵中对应的路径长度大于0 2.该单元四周的方格值小于等于当前单元的方格值 //进一步递归 if(memoryMatrix[cor_x][cor_y]>0)return memoryMatrix[cor_x][cor_y]; int length = 1; if(cor_x<matrix.size()-1){ if(matrix[cor_x+1][cor_y]>matrix[cor_x][cor_y]){ length = max(length,search(cor_x+1,cor_y,matrix,memoryMatrix)+1); } } if(cor_x>0){ if(matrix[cor_x-1][cor_y]>matrix[cor_x][cor_y]){ length = max(length,search(cor_x-1,cor_y,matrix,memoryMatrix)+1); } } if(cor_y<matrix[0].size()-1){ if(matrix[cor_x][cor_y+1]>matrix[cor_x][cor_y]){ length = max(length,search(cor_x,cor_y+1,matrix,memoryMatrix)+1); } } if(cor_y>0){ if(matrix[cor_x][cor_y-1]>matrix[cor_x][cor_y]){ length = max(length,search(cor_x,cor_y-1,matrix,memoryMatrix)+1); } } //当前层逻辑处理 memoryMatrix[cor_x][cor_y] = length; return length; //善后处理 } int longestIncreasingPath(vector<vector<int>>& matrix) { if (matrix.size() == 0 || matrix[0].size() == 0) return 0; int result=0; vector<int> temp(matrix[0].size(),0); vector<vector<int>> memoryMatrix(matrix.size(),temp); for(int i=0;i<matrix.size();i++){ for(int j=0;j<matrix[0].size();j++){ //printf("%d %d ",i,j); result = max(result,search(i,j,matrix,memoryMatrix)); } } return result; } }; /* 我的思路是深搜+记忆化 使用一个同规格大小的memoryMatrix矩阵存储对应位置单元格作为起点的最大递增路径长度。 int search(int cor_x,int cor_y,vector<vector<int>>& matrix,vector<vector<int>>& memoryMatrix){ //递归终止的条件:1.当前方格已被搜索过,记忆矩阵中对应的路径长度大于0 2.该单元四周的方格值小于等于当前单元的方格值 if(memoryMatrix[cor_x][cor_y]>0)return memoryMatrix[cor_x][cor_y]; int length = 1; if(cor_x<matrix.size()){ if(matrix[cor_x+1][cor_y]>matrix[cor_x][cor_y]){ length = max(length,search(cor_x+1,cor_y,matrix,memoryMatrix)+1); } } if(cor_x>0){ if(matrix[cor_x-1][cor_y]>matrix[cor_x][cor_y]){ length = max(length,search(cor_x-1,cor_y,matrix,memoryMatrix)+1); } } if(cor_y<matrix[0].size()){ if(matrix[cor_x][cor_y+1]>matrix[cor_x][cor_y]){ length = max(length,search(cor_x,cor_y+1,matrix,memoryMatrix)+1); } } if(cor_y>0){ if(matrix[cor_x][cor_y-1]>matrix[cor_x][cor_y]){ length = max(length,search(cor_x,cor_y-1,matrix,memoryMatrix)+1); } } //当前层逻辑处理 memoryMatrix[cor_x][cor_y] = length; //进一步递归 //善后处理 } */
时间复杂度是mn
空间复杂度也是mn
拓展学习
一点改进:在搜索临近方格时可以预先存储移动的向量(0,1),(0,-1),(1,0)等,代码会更优雅。静态常量变量可以在类中初始化https://blog.csdn.net/Clengupup/article/details/83059231
const与constexprhttps://blog.csdn.net/Function_Dou/article/details/84523482