329. 矩阵中的最长递增路径
Posted still-smile
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了329. 矩阵中的最长递增路径相关的知识,希望对你有一定的参考价值。
给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。
示例 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]。注意不允许在对角线方向上移动。
解题思路:memo[i][j] 表示从[i,j]开始的最长递增路径的长度.
dfs 返回值 也是该点开始的最长递增路径的长度,显然,当前点的最长路径 = 能走到的下个点的最长路径 + 1
在dfs函数中,tmp变量初始化为1,表示从该点开始,未向外扩展时,长度为1.
int dict[4][2] = { {-1, 0}, {0, -1}, {1, 0}, {0, 1} }; int dfs(int **matrix, int **memo, int row, int col, int i, int j) { if (memo[i][j]) return memo[i][j]; int tmp = 1; for (int k = 0; k < 4; k++) { int x = i + dict[k][0]; int y = j + dict[k][1]; if (x >= 0 && x < row && y >= 0 && y < col && matrix[x][y] > matrix[i][j]) { tmp = fmax(tmp, dfs(matrix, memo, row, col, x, y) + 1); } } memo[i][j] = tmp; return memo[i][j]; } int longestIncreasingPath(int** matrix, int matrixSize, int* matrixColSize){ if (matrix == NULL) { return 0; } int **memo = (int **)malloc(matrixSize * sizeof(int *)); for (int i = 0; i < matrixSize; i++) { memo[i] = (int *)calloc(matrixColSize[0], sizeof(int)); } int res = 0; for (int i = 0; i < matrixSize; i++) { for (int j = 0; j < matrixColSize[0]; j++) { res = fmax(res, dfs(matrix, memo, matrixSize, matrixColSize[0], i, j)); } } for (int i = 0; i < matrixSize; i++) { free(memo[i]); } free(memo); return res; }
以上是关于329. 矩阵中的最长递增路径的主要内容,如果未能解决你的问题,请参考以下文章