📅  最后修改于: 2023-12-03 15:41:01.777000             🧑  作者: Mango
在给定的矩阵中,找到一条最长的递增路径,这条路径可以从任何一个起点开始,移动到相邻的位置(上、下、左或右),若下一个位置的值比当前位置的值大,则可以继续移动;若下一个位置的值不比当前位置的值大,则路径结束。
输入:
matrix = [
[9,9,4],
[6,6,8],
[2,1,1]
]
输出:4
解释:最长的递增路径是 [1, 2, 6, 9]。
本题可以使用动态规划,其状态转移方程如下:
$$ dp[i][j] = max(dp[i + 1][j], dp[i - 1][j], dp[i][j + 1], dp[i][j - 1]) $$
先从一个点出发,判断其相邻的四个方向是否可以继续递增,如果递增,则继续递归查找该点的下一步,如果不递增,则返回当前的长度,同时更新全局的最大路径长度。
以下是Python3语言的代码实现,其中mem
代表记忆化数组,用于存储已经计算过的结果,避免重复计算。
class Solution:
def __init__(self):
self.mem = []
self.max_length = 0
def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
row, col = len(matrix), len(matrix[0])
self.mem = [[0] * col for _ in range(row)]
for i in range(row):
for j in range(col):
self.max_length = max(self.max_length, self.dfs(matrix, i, j))
return self.max_length
def dfs(self, matrix, i, j):
if self.mem[i][j] != 0:
return self.mem[i][j]
row, col = len(matrix), len(matrix[0])
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
length = 1
for k in range(4):
x, y = i + dx[k], j + dy[k]
if 0 <= x < row and 0 <= y < col and matrix[x][y] > matrix[i][j]:
length = max(length, 1 + self.dfs(matrix, x, y))
self.mem[i][j] = length
return length
以上是本题的解题思路和Python3语言的代码实现,时间复杂度为O(mn),其中m和n分别代表矩阵的行数和列数。