📅  最后修改于: 2023-12-03 14:56:29.514000             🧑  作者: Mango
给定一个矩阵,找到其中最长的递增路径。递增路径定义为从左上角开始,每一个相邻的元素都比前一个元素大的路径。
此问题可以用动态规划来解决。我们可以维护一个二维数组 dp
,其中 dp[i][j]
表示以位置 (i, j)
为起点时最长的递增路径的长度。然后我们遍历整个矩阵,对于每个位置 (i, j)
,从其上方、下方、左侧、右侧四个位置中找到一个比当前位置大的位置,然后将其 dp
值加 1
。维护一个变量 res
来记录所有 dp
值中的最大值,最后返回 res
。
def longestIncreasingPath(matrix):
if not matrix:
return 0
m, n = len(matrix), len(matrix[0])
dp = [[0 for _ in range(n)] for _ in range(m)]
def dfs(i, j, matrix, dp):
if dp[i][j] != 0:
return dp[i][j]
directions = [(0, -1), (-1, 0), (0, 1), (1, 0)]
currMax = 1
for d in directions:
row, col = i + d[0], j + d[1]
if row >= 0 and row < m and col >= 0 and col < n:
if matrix[row][col] > matrix[i][j]:
nextMax = 1 + dfs(row, col, matrix, dp)
currMax = max(currMax, nextMax)
dp[i][j] = currMax
return currMax
res = 0
for i in range(m):
for j in range(n):
currMax = dfs(i, j, matrix, dp)
res = max(res, currMax)
return res
暴力解法的时间复杂度为 $O(4^{mn})$,空间复杂度为 $O(mn)$,其中 $m$ 和 $n$ 分别为矩阵的行数和列数。优化后的时间复杂度为 $O(mn)$,空间复杂度为 $O(mn)$。