Longest Increasing Path in a Matrix

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 =
[
[ ,9 ,4],
[ ,6 ,8],
[,,1]
]
Output: 4
Explanation: The longest increasing path is [1, 2, 6, 9].

2.题目分析

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

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

  • 判断条件, 满足a>b or a
  • 边界条件,给定矩阵可能为空。

解题思路:
采用图搜索法。对于矩阵的每个点,我们都计算其作为起点可以获得的最长递增路径值。首先我们得求出这个对应路径矩阵。
策略是动态规划(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 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 Matrix)