这个题解采用深度优先搜索(DFS)的方式,对矩阵中的每个元素进行搜索。对于每个元素,分别向上、下、左、右四个方向搜索比当前元素值小的相邻元素,找出以当前元素为起点的最长递增路径。在搜索过程中,使用记忆化的方式存储已计算过的元素的最长递增路径长度,避免重复计算。最后,取所有元素的最长递增路径长度的最大值作为整个矩阵的最长递增路径长度。
时间复杂度: O(m*n)
空间复杂度: O(m*n)
class Solution:
def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
if not matrix:
return 0
m = len(matrix)
n = len(matrix[0])
Maxnum = 0
stores = [ [None]*n for i in range(m)] # 记忆化数组,存储每个元素的最长递增路径长度
def search_self(x,y):
nonlocal Maxnum
compares = []
# 向上搜索
if x != 0 and matrix[x-1][y] < matrix[x][y]:
compares.append(stores[x-1][y]) if stores[x-1][y] else compares.append(search_self(x-1,y))
# 向左搜索
if y != 0 and matrix[x][y-1] < matrix[x][y] :
compares.append(stores[x][y-1]) if stores[x][y-1] else compares.append(search_self(x,y-1))
# 向下搜索
if x != m - 1 and matrix[x+1][y] < matrix[x][y]:
compares.append(stores[x+1][y]) if stores[x+1][y] else compares.append(search_self(x+1,y))
# 向右搜索
if y != n - 1 and matrix[x][y+1] < matrix[x][y]:
compares.append(stores[x][y+1]) if stores[x][y+1] else compares.append(search_self(x,y+1))
stores[x][y] = max(compares) + 1 if compares else 1 # 更新当前元素的最长递增路径长度
Maxnum = max(stores[x][y],Maxnum) # 更新整个矩阵的最长递增路径长度
return stores[x][y]
for i in range(m):
for j in range(n):
if not stores[i][j]: # 如果当前元素的最长递增路径长度还没有计算过,则进行搜索
search_self(i,j)
return Maxnum