题意分析
329. 矩阵中的最长递增路径 - 力扣(LeetCode)
这题就是一个就是求最长的递增路径,所以就是一个深搜的问题,不过要加上记忆化搜索来降低时间复杂度,所以这题不需要一个数组来额外记录是否经历过。总的来说还是比较简单的。
算法思路
深度优先搜索的实现
- 写一个判断下标是否符合条件的函数。
- 遍历每个坐标的四周,符合条件的就继续深搜。
深搜过程中,如果已经搜索过就直接返回之前搜索过的结果。
如果没有搜索过,就继续递归。
3.最后用一个全局变量记录所有出发的最大值即可。
代码实现
int dirs[]={-1,0,1,0,-1};
class Solution {
public:
int ans=0;
vector<vector<int>> pathnum;
int longestIncreasingPath(vector<vector<int>>& matrix) {
int m=matrix.size(),n=matrix[0].size();
pathnum.resize(m,vector<int>(n,-1));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
int t=dfs(i,j,matrix);
ans=max(ans,t);
}
}
return ans;
}
bool isvalid(int i,int j,int m,int n){
if(i<0||i>=m||j<0||j>=n) return false;
return true;
}
int dfs(int i,int j,vector<vector<int>>&matrix){
int m=matrix.size(),n=matrix[0].size();
if(!isvalid(i,j,m,n)) return 0;
if(pathnum[i][j]!=-1) return pathnum[i][j];
int sum=0;
for(int k=0;k<4;k++){
int x=i+dirs[k],y=j+dirs[k+1];
if(!isvalid(x,y,m,n)) continue;
if(matrix[i][j]<matrix[x][y]){//满足当前的比较小才去搜索
int t=dfs(x,y,matrix);
sum=max(sum,t);
}
}
pathnum[i][j]=sum+1;
return pathnum[i][j];
}
};
解题总结
熟悉深度优先搜索的模板,懂得如何用记忆化搜索进行优化,最后根据题目的限制条件限制进一步的递归,就能得解。