题意
题目的意思就是在一个矩阵中找出一个最长的递增序列
思路
这个题目是很明显的需要使用深度优先搜索方法的。矩阵中的每个位置都可能是序列的起点,所以需要遍历所有的位置,在搜索路径上的一个位置时,如果周围的数字不比自己大,这时候就返回,当前路径搜索结束。这里会存在可以优化的空间,就是搜索路径中会存在很多的重复,所以我们可以使用额外的空间存放每个位置为起点的最长序列。实现代码如下:
class Solution {
public:
int helper(vector<vector<int>>& matrix,int i,int j){
if(visited[i][j]!=0)
return visited[i][j];
int left=0;
if(j>0&&matrix[i][j]<matrix[i][j-1]){
left=helper(matrix,i,j-1);
}
int right=0;
if(j<COL-1&&matrix[i][j]<matrix[i][j+1])
right=helper(matrix,i,j+1);
int up=0;
if(i>0&&matrix[i][j]<matrix[i-1][j])
up=helper(matrix,i-1,j);
int down=0;
if(i<ROW-1&&matrix[i][j]<matrix[i+1][j])
down=helper(matrix,i+1,j);
visited[i][j]=1+max(max(right,left),max(up,down));
return visited[i][j];
}
int longestIncreasingPath(vector<vector<int>>& matrix) {
int row=matrix.size();
if(row==0)
return 0;
int col=matrix[0].size();
int result=0;
ROW=row;
COL=col;
vector<vector<int>> temp(ROW,vector<int>(COL,0));
visited=temp;
for(int i=0;i<row;++i){
for(int j=0;j<col;++j){
//start at [i,j]
int temp=helper(matrix,i,j);
//visited[i][j]=temp;
result=max(result,temp);
}
}
return result;
}
private:
int ROW=0;
int COL=0;
vector<vector<int>> visited;
};