码迷,mamicode.com
首页 > 其他好文 > 详细

329. 矩阵中的最长递增路径

时间:2020-07-27 09:50:48      阅读:55      评论:0      收藏:0      [点我收藏+]

标签:long   int   移动   初始化   tin   code   path   color   16px   

给定一个整数矩阵,找出最长递增路径的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

示例 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. 矩阵中的最长递增路径

标签:long   int   移动   初始化   tin   code   path   color   16px   

原文地址:https://www.cnblogs.com/still-smile/p/13382870.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!