329. Longest Increasing Path in a Matrix
By Jalan
文章目录
知识工具需求
数据结构和算法
- 记忆化递归
题解
第一次
思路
看到这题我本来的第一想法是动态规划,但是不幸的是,状态转移方程虽然可以写出来,但是实现的时候边界条件太多了.
这题的关键是,对于节点
i
i
i,假如他的值是
v
i
v_i
vi,把
i
i
i上下左右四个点中值比小
v
i
v_i
vi的点找出来,这种小于关系可以抽象成边,在这个图里进行DFS
又因为路径是有连续性的,所以一个点的最长路径的值可以被多次复用,使用一个数组memo来进行记忆化DFS
代码
CPP
class Solution
{
public:
int n, m;
void memoDFS(int i, int j, vector<vector<int>> &matrix, vector<vector<int>> &memo)
{
int nowValue = matrix[i][j];
int maxRoute = 1;
if (i - 1 >= 0 && matrix[i - 1][j] < nowValue)
{
if (memo[i - 1][j] == 0)
memoDFS(i - 1, j, matrix, memo);
maxRoute = max(maxRoute, memo[i - 1][j] + 1);
}
if (i + 1 <= m - 1 && matrix[i + 1][j] < nowValue)
{
if (memo[i + 1][j] == 0)
memoDFS(i + 1, j, matrix, memo);
maxRoute = max(maxRoute, memo[i + 1][j] + 1);
}
if (j - 1 >= 0 && matrix[i][j - 1] < nowValue)
{
if (memo[i][j - 1] == 0)
memoDFS(i, j - 1, matrix, memo);
maxRoute = max(maxRoute, memo[i][j - 1] + 1);
}
if (j + 1 <= n - 1 && matrix[i][j + 1] < nowValue)
{
if (memo[i][j + 1] == 0)
memoDFS(i, j + 1, matrix, memo);
maxRoute = max(maxRoute, memo[i][j + 1] + 1);
}
memo[i][j] = maxRoute;
}
int longestIncreasingPath(vector<vector<int>> &matrix)
{
if (matrix.size() == 0 || matrix[0].size() == 0)
return 0;
m = matrix.size();
n = matrix[0].size();
vector<vector<int>> memo(m);
for (int i = 0; i < m; i++)
{
memo[i].resize(n);
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (memo[i][j] == 0)
memoDFS(i, j, matrix, memo);
}
}
int longest = 0;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (memo[i][j] > longest)
{
longest = memo[i][j];
}
}
}
return longest;
}
};
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀
@.@
也欢迎关注我的CSDN账号呀=]
**开心code每一天**