文章目录
- 1. 题目
- 2. 解题
- 2.1 记忆化递归
- 2.2 拓扑排序
1. 题目
给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。
你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
示例 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]。
注意不允许在对角线方向上移动。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
2.1 记忆化递归
class Solution {int m, n;int longest = 1;vector<vector<int>> dir = {{-1,0},{1,0},{0,1},{0,-1}};
public:int longestIncreasingPath(vector<vector<int>>& mat) {if(mat.empty() || mat[0].empty())return 0;m = mat.size(), n = mat[0].size();vector<vector<int>> s(m, vector<int>(n,0));for(int i = 0, j; i < m; ++i)for(j = 0; j < n; ++j){if(s[i][j] != 0)//走过的路不走continue;longest = max(longest, dfs(i,j,mat,s));}return longest;}int dfs(int i, int j, vector<vector<int>>& mat, vector<vector<int>>& s){if(s[i][j] != 0)return s[i][j];int x, y, k, longestpathofnext = 0;for(k = 0; k < 4; ++k){x = i + dir[k][0];y = j + dir[k][1];if(x>=0 && x<m && y>=0 && y<n && mat[i][j] > mat[x][y]){longestpathofnext = max(longestpathofnext, dfs(x,y,mat,s));}}return s[i][j] = 1+longestpathofnext;}
};
76 ms 14.1 MB
2.2 拓扑排序
见官方解答
- 找到周围点比我小的,入度+1,统计一遍
- 入度为0的全部入队列,BFS的最大层数为最长路径长度
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!