n * n矩阵中的所有可能路径 - python
Posted
技术标签:
【中文标题】n * n矩阵中的所有可能路径 - python【英文标题】:All possible paths in n*n matrix - python 【发布时间】:2015-09-14 00:51:38 【问题描述】:我正在尝试解决一个面试问题:
给定一个 n*n 矩阵,假设您从左上角的单元格(即 0,0)开始。您可以向右或向下移动,并且您必须前往右下角的单元格。获取小于给定值的最大值。例如,假设 3*3 矩阵,给定值为
5
。
0 1 2
2 1 2
3 2 1
optimal path is 0 -> 1 -> 1 -> 2 -> 1 = 5
我开始使用递归进行编码,但答案不正确。有什么建议吗?
def findAllPaths(currX, currY, path, grid, sum):
#print currX, currY
if currX == len(grid)-1:
i = currY
temp = 0
while i < len(grid):
path = path + str(grid[currX][i])
temp += grid[currX][i]
i += 1
sum.append(temp)
#print 'first loop', sum, path
return
if currY == len(grid)-1:
i = currX
temp = 0
while i < len(grid):
path = path + str(grid[i][currY])
temp += grid[i][currY]
i += 1
sum.append(temp)
#print 'second loop', sum, path
return
#print currX, currY
#path = path + str(grid[currX][currY])
findAllPaths(currX+1,currY,path,grid, sum)
findAllPaths(currX, currY+1,path,grid, sum)
return sum
【问题讨论】:
【参考方案1】:您添加到 sum 和 path 而不删除任何内容。这对于递归函数来说是有问题的,因为您将尝试一条路径,并且当您回溯时,您不会删除这些路径。您需要复制 (cpysum = sum[:]
) 或在递归后删除内容但找不到解决方案。
【讨论】:
【参考方案2】:我正在使用动态编程来完成这项任务。通过找到路径的最小值,程序只需要计算当前值+上一步的最小值。
def minPathSum(grid):
res = 0
if grid:
n,m = len(grid),len(grid[0])
dp = [[0]* m for _ in range(n)]
dp[0][0]= grid[0][0]
for i in range(1,m):
dp[0][i] = dp[0][i-1] + grid[0][i]
for i in range(1,n):
dp[i][0] = dp[i-1][0]+grid[i][0]
for i in range(1,n):
for j in range(1,m):
dp[i][j] = grid[i][j]
dp[i][j] += min(dp[i][j-1],dp[i-1][j])
res = dp[-1][-1]
return res
grid = [ [0,1,2],[2 ,1 ,2],[3 ,2 ,1]]
print(minPathSum(grid))
【讨论】:
以上是关于n * n矩阵中的所有可能路径 - python的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):数组类:第54题:给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。