思路:
遍历整个矩阵,对于一个值,如果它上下左右有值大于它,那么建立一条指向这个值的边,然后进行拓扑排序,排序的最大深度即为答案。
class Solution {
public:
int indeg[100005];
int outdeg[100005];
vector<int>ve[100005];
int ans[100005];
int longestIncreasingPath(vector<vector<int>>& matrix) {
int n=matrix.size();
int m=matrix[0].size();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int pos=i*m+j;
if(i-1>=0&&matrix[i-1][j]>matrix[i][j])
{
ve[pos].push_back((i-1)*m+j);
indeg[(i-1)*m+j]++;
outdeg[pos]++;
}
if(i+1<n&&matrix[i+1][j]>matrix[i][j])
{
ve[pos].push_back((i+1)*m+j);
indeg[(i+1)*m+j]++;
outdeg[pos]++;
}
if(j-1>=0&&matrix[i][j-1]>matrix[i][j])
{
ve[pos].push_back(i*m+j-1);
indeg[i*m+j-1]++;
outdeg[pos]++;
}
if(j+1<m&&matrix[i][j+1]>matrix[i][j])
{
ve[pos].push_back(i*m+j+1);
indeg[i*m+j+1]++;
outdeg[pos]++;
}
}
}
queue<int>que;
for(int i=0;i<n*m;i++)
{
if(indeg[i]==0)que.push(i);
}
while (!que.empty())
{
int p=que.front();
que.pop();
for(int i=0;i<ve[p].size();i++)
{
indeg[ve[p][i]]--;
if (indeg[ve[p][i]]==0)
{
ans[ve[p][i]]=ans[p]+1;
que.push(ve[p][i]);
}
}
}
int ma=0;
for(int i=0;i<n*m;i++)ma=max(ma,ans[i]);
return ma+1;
}
};