传送门
题目描述
给定一个整数矩阵,找出最长递增路径的长度。 对于每个单元格,你可以往上,下,左,右四个方向移动。
你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
示例 1:
输入: nums = [ [9,9,4], [6,6,8], [2,1,1] ]
输出: 4
解释: 最长递增路径为[1, 2, 6, 9]。
示例 2:
输入: nums = [ [3,4,5], [3,2,6], [2,2,1] ]
输出: 4
解释: 最长递增路径是 [3, 4, 5, 6]。
注意不允许在对角线方向上移动。
代码题解
struct ordxy
{
int x;
int y;
};
int a[4] = { 0,0,-1,1 };
int b[4] = { 1,-1,0,0 };
int sizex, sizey;
multimap<int, ordxy>sortvec;
int dfs(vector<vector<int>>& matrix, vector<vector<int>>& visited, int x, int y, int length)
{
int len = length;
for (int i = 0; i < 4; i++)
{
if (x + a[i] >= 0 && x + a[i] < sizex && y + b[i] >= 0 && y + b[i] < sizey && matrix[x + a[i]][y + b[i]] > matrix[x][y])
{
if (visited[x + a[i]][y + b[i]] == 1)
{
visited[x + a[i]][y + b[i]] = dfs(matrix, visited, x + a[i], y + b[i], length + 1) - length;
len = max(len, visited[x + a[i]][y + b[i]]+length);
}
else
len = max(len, length + visited[x + a[i]][y + b[i]]);
}
}
//visited[x][y] = len;
return len;
}
class Solution {
public:
int longestIncreasingPath(vector<vector<int>>& matrix) {
if (matrix.size() == 0)
return 0;
int result = 1;
sizex = matrix.size();
sizey = matrix[0].size();
vector<vector<int>>visited(sizex, vector<int>(sizey, 1));
for (int i = 0; i < sizex; i++)
{
for (int j = 0; j < sizey; j++)
{
if (visited[i][j] == 1)
visited[i][j] = dfs(matrix, visited, i, j, 1);
result = max(result, visited[i][j]);
}
}
return result;
}
};