美文网首页
Longest Increasing Path in a Mat

Longest Increasing Path in a Mat

作者: 想跳舞的兔子 | 来源:发表于2019-01-14 13:28 被阅读0次

    1.题目描述(难度Hard)

    Given an integer matrix, find the length of the longest increasing path.

    From each cell, you can either move to four directions: left, right, up or down. You may NOT move diagonally or move outside of the boundary (i.e. wrap-around is not allowed).
    Example :
    Input: nums =
    [
    [ \color{red}{9} ,9 ,4],
    [\color{red}{6} ,6 ,8],
    [\color{red}{2},\color{red}{1},1]
    ]
    Output: 4
    Explanation: The longest increasing path is [1, 2, 6, 9].

    2.题目分析

    题目要求的是在一个矩阵中,找最长递增的路径,当然也可以理解成为最长递减的路径,因为递增和递减都是一样的,只要有一个方向对,另一个方向就是我们要求的。

    给定矩阵中邻接着的两个元素,a,b

    • 判断条件, 满足a>b or a<b,选一个即可。因为是严格要求递增/递减,所以a==b这种情况我们是不考虑在内的,即不会增加路径的长度。
    • 边界条件,给定矩阵可能为空。

    解题思路:
    采用图搜索法。对于矩阵的每个点,我们都计算其作为起点可以获得的最长递增路径值。首先我们得求出这个对应路径矩阵。
    策略是动态规划(DP)+深度优先搜索(DFS)
    DP对应路径矩阵为visted,dfs(i,j)则计算相应的visited[i][j]的值。
    则动态规划公式为:
    visited[i][j]=1+max(dfs(i-1,j),dfs(i+1,j),dfs(i,j-1),dfs(i,j+1))
    需要注意的是以dfs(i-1,j)为例,需要满足的条件是i>0且matrix[i][j]>matrix[i-1][j] 否则 为 0,这个判断是放在dfs函数体里面还是外面,看个人喜好,下面的例子是放在函数体外面,即在调用dfs(i,j)之前判断i,j是否越界

    3.解题过程

    Begin(算法开始)
    输入 矩阵Matrix
    IF Matrix is Empty return 0
    初始化visited的0矩阵
    m,n分别赋值为matrix 的行列值
    求出每个visited[i][j]=dfs(i,j),其中0<=i<m,0<=j<n.
    return 最大的visited[i][j]
    End (算法结束)

    Begin(dfs,i,j)
    IF visited[i][j]!=0 return visited[i][j]//表示该路径已经求过
    visited[i][i] = 1+ max(
    dfs(i-1,j) if i>0 且 matrix[i][j]>matrix[i-1][j] else 0,
    ...
    )
    return visited[i][j]
    End (算法结束)

    具体代码(python)已对应实现,但是测试用例代码还没完善,如上述思路有不足之处请批评指正。

    相关文章

      网友评论

          本文标题:Longest Increasing Path in a Mat

          本文链接:https://www.haomeiwen.com/subject/lzkddqtx.html