題意
題目的意思就是在一個矩陣中找出一個最長的遞增序列
思路
這個題目是很明顯的需要使用深度優先搜索方法的。矩陣中的每個位置都可能是序列的起點,所以需要遍歷所有的位置,在搜索路徑上的一個位置時,如果周圍的數字不比自己大,這時候就返回,當前路徑搜索結束。這裏會存在可以優化的空間,就是搜索路徑中會存在很多的重複,所以我們可以使用額外的空間存放每個位置爲起點的最長序列。實現代碼如下:
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;
};