题解 | #矩阵最长递增路径#
矩阵最长递增路径
https://www.nowcoder.com/practice/7a71a88cdf294ce6bdf54c899be967a2
class Solution { //图论解法,以出度为0为一层的开始。 public: //记录四个方向 int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; int n, m; int solve(vector<vector<int> >& matrix) { //空矩阵 if (matrix.size() == 0 || matrix[0].size() == 0) return 0; n = matrix.size(); m = matrix[0].size(); //记录每个单元的出度 vector<vector<int> > outdegrees(n, vector<int> (m)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { for (int k = 0; k < 4; k++) { int nexti = i + dirs[k][0]; int nextj = j + dirs[k][1]; if (nexti >= 0 && nexti < n && nextj >= 0 && nextj < m && matrix[nexti][nextj] > matrix[i][j]) { //符合条件,记录出度 outdegrees[i][j]++; } } } } queue <pair<int, int> > q; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (outdegrees[i][j] == 0) //找到出度为0的入队列 q.push({i, j}); int res = 0; //bfs,图论解法 //每一次直接把一层的循环完,然后寻找出度为0的点,因为我们一开始就是按照出度为0开始加入列的。 //以出度为0为一层的开始。 while (!q.empty()) { res++; int size = q.size(); for (int x = 0; x < size; x++) {//每一次直接把一层的循环完 pair<int, int> temp = q.front(); q.pop(); int i = temp.first; int j = temp.second; //四个方向 for (int k = 0; k < 4; k++) { int nexti = i + dirs[k][0]; int nextj = j + dirs[k][1]; //逆向搜索,所以下一步是小于 if (nexti >= 0 && nexti < n && nextj >= 0 && nextj < m && matrix[nexti][nextj] < matrix[i][j]) { //符合条件,出度递减 outdegrees[nexti][nextj]--; if (outdegrees[nexti][nextj] == 0) { q.push({nexti, nextj}); } } } } } return res; } };