题目:
给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你 不能 在 对角线 方向上移动或移动到 边界外(即不允许环绕)。
解答:
方法一:超出时间限制
class Solution:
def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
directions=[[-1,0],[1,0],[0,-1],[0,1]]
m=len(matrix)
n=len(matrix[0])
def InArea(x,y):
if 0<=x<m and 0<=y<n:
return True
return False
res=0
def dfs(i,j,ans):
nonlocal res
res=max(res,ans)
for dx,dy in directions:
x,y=i+dx,j+dy
if InArea(x,y) and matrix[x][y]>matrix[i][j]:
dfs(i+dx,j+dy,ans+1)
for i in range(m):
for j in range(n):
dfs(i,j,1)
return res
方法二:记忆化搜索
class Solution:
def longestIncreasingPath(self, matrix: List[List[int]]) -> int:
directions=[[-1,0],[1,0],[0,-1],[0,1]]
m=len(matrix)
n=len(matrix[0])
def InArea(x,y):
if 0<=x<m and 0<=y<n:
return True
return False
memory=[[0]*n for _ in range(m)]
#以(i,j)为起点的最长搜索路径的长度为ans
def dfs(i,j):
nonlocal memory
#(i,j)位置已被搜索过,返回以该位置为起点的最长搜索路径长度
if memory[i][j]!=0:
return memory[i][j]
#以(i,j)为起点进行搜索
memory[i][j]=1
for dx,dy in directions:
x,y=i+dx,j+dy
if InArea(x,y) and matrix[x][y]>matrix[i][j]:
memory[i][j]=max(memory[i][j],dfs(x,y)+1)
return memory[i][j]
res=0
for i in range(m):
for j in range(n):
tmp=dfs(i,j)
res=max(res,tmp)
return res