leetcode0329. 矩阵中的最长递增路径-hard
1 题目:矩阵中的最长递增路径
官方标定难度:难
给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。
示例 1:
输入:matrix = [[9,9,4],[6,6,8],[2,1,1]]
输出:4
解释:最长递增路径为 [1, 2, 6, 9]。
示例 2:
*
输入:matrix = [[3,4,5],[3,2,6],[2,2,1]]
输出:4
解释:最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。
示例 3:
输入:matrix = [[1]]
输出:1
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 200
0 <= matrix[i][j] <= 2 31 2^{31} 231 - 1
2 solution
本题是搜索最长递增序列,第一感觉就是深度优先搜索,如果从一个位置开始,最长递增序列的长度是多少,最后找最大值即可,但是如果直接搜索复杂度过高,所以如果某一个地方搜索过了,就保存下来,确保每一个格子只进行一次深度搜索,即所谓的记忆化深度优先搜索。
代码
class Solution {int m, n;vector<vector<int>> mat;vector<vector<int>> len;vector<int> dr = {1, -1, 0, 0};vector<int> dc = {0, 0, 1, -1};int dfs(int r, int c) {if (len[r][c]) return len[r][c];int l = 0;for (int i = 0; i < 4; i++) {int x = r + dr[i];int y = c + dc[i];if (x < 0 || x == m || y < 0 || y == n) continue;if (mat[x][y] > mat[r][c]) {l = max(l, dfs(x, y));}}return len[r][c] = l + 1;}public:int longestIncreasingPath(vector<vector<int>> &matrix) {m = matrix.size();n = matrix[0].size();len = vector<vector<int>>(m, vector<int>(n));mat = matrix;int M = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (!len[i][j]) {M = max(M, dfs(i, j));}}}return M;}
};