leetcode 329 Longest Increasing Path in a Matrix解题报告
首先很开心,在没有看任何解答的情况下解出了这道题!
方法一:
从每一个点出发,简单的DFS,单纯用mem来记录访问过的位置,当mem[i][j]=1时代表访问过数组,则以后不再访问。结果是超时了。
int longestIncreasingPath(vector<vector<int>>& matrix) {
if(matrix.empty())return 0;
int ans=0;
vector<vector<int>>mem(matrix.size());
for(int i=0;i<matrix.size();i++){
mem[i].resize(matrix[0].size(),0);
}
for(int i=0;i<matrix.size();i++)
for(int j=0;j<matrix[0].size();j++){
ans=max(ans,dfs(i,j,matrix,mem));
//cout<<dfs(i,j,matrix,mem)<<endl;
}
return ans+1;
}
int dfs(int i,int j,vector<vector<int>>& matrix,vector<vector<int>> mem){
if(mem[i][j]==1)return 0;
mem[i][j]=1;
vector<pair<int,int>>v{
{0,1},{0,-1},{-1,0},{1,0}};
int a=0;
for(auto p:v){
int x=i+p.first;
int y=j+p.second;
int num=0;
if(x>=0 && x<matrix.size() && y>=0 && y<matrix[0].size()){
if(matrix[i][j]<matrix[x][y]) num=1+dfs(x,y,matrix,mem);
}
//cout<<num<<endl;
a=max(a,num);
}
return a;
}
方法二:
其实是基于方法一,只不过增加了mem的功能,用于记录访问过的位置的最长路径。将mem初始设为-1。
int longestIncreasingPath(vector<vector<int>>& matrix) {
if(matrix.empty())return 0;
int ans=0;
vector<vector<int>>mem(matrix.size());
for(int i=0;i<matrix.size();i++){
mem[i].resize(matrix[0].size(),-1);
}
for(int i=0;i<matrix.size();i++)
for(int j=0;j<matrix[0].size();j++){
ans=max(ans,dfs(i,j,matrix,mem));
}
return ans+1;
}
int dfs(int i,int j,vector<vector<int>>& matrix,vector<vector<int>> &mem){
if(mem[i][j]!=-1)return mem[i][j];
mem[i][j]=0;
vector<pair<int,int>>v{
{0,1},{0,-1},{-1,0},{1,0}};
int a=0;
for(auto p:v){
int x=i+p.first;
int y=j+p.second;
int num=0;
if(x>=0 && x<matrix.size() && y>=0 && y<matrix[0].size()){
if(matrix[i][j]<matrix[x][y]) num=1+dfs(x,y,matrix,mem);
}
//cout<<num<<endl;
mem[i][j]=max(mem[i][j],num);
}
return mem[i][j];}
方法三:
改变了一下dfs的写法,本以为会小小提升一下速度,但是似乎没什么效果。
int longestIncreasingPath(vector<vector<int>>& matrix) {
if(matrix.empty())return 0;
int ans=0;
vector<vector<int>>mem(matrix.size());
for(int i=0;i<matrix.size();i++){
mem[i].resize(matrix[0].size(),-1);
}
for(int i=0;i<matrix.size();i++)
for(int j=0;j<matrix[0].size();j++){
ans=max(ans,dfs(i,j,INT_MIN,matrix,mem));
}
return ans;
}
int dfs(int i,int j,int pre,vector<vector<int>>& matrix,vector<vector<int>> &mem){
if(i>=matrix.size() || i<0 || j>=matrix[0].size() || j<0 || matrix[i][j]<=pre) return 0;
if(mem[i][j]!=-1)return mem[i][j];
vector<pair<int,int>>v{
{0,1},{0,-1},{-1,0},{1,0}};
int a=0;
for(auto p:v){
int x=i+p.first;
int y=j+p.second;
mem[i][j]=max(mem[i][j],1+dfs(x,y,matrix[i][j],matrix,mem));
}
return mem[i][j];
}
上一篇:
IDEA上Java项目控制台中文乱码
