秋招已过去一大半,之前因为实习,没好好刷题,多次笔试都栽在了图论上,今天决定好好学习图论!加油!只要坚持努力就不怕晚~
找图中的路径
力扣797题
给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)
二维数组的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些节点,空就是没有下一个结点了。
译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/all-paths-from-source-to-target
自己的思路:读懂题意后发现这应该用DFS+回溯来做,但是编程还是出错,原因是还是没有分析好题目。
自己原来的代码:
class Solution:
def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:
res = []
path = []
def dfs(node):
path.append(node)
if not graph[node]://错误1:没有读清楚题目
res.append(path)//错误2:path[:]和path的区别
return
for j in graph[node]:
dfs(j)
path.pop()
for i in range(len(graph))://错误3:不应该加遍历
dfs(i)
return res
错误1:题目说是找出所有从节点 0 到节点 n-1 的路径 自己没有好好读题,以为是下一个节点为[]就为一条路径。
错误2:看了的答案,没有很理解,但懂个大概python中list[0啥意思_python中<list>和<list>[:]的区别_weixin_39800990的博客-CSDN博客
path[:]是path[]的深拷贝,两个列表是不同的,path.pop()后不会改变path[:],如果直接append path,res的值就会随path改变。
错误3:题目说是找出所有从节点 0 到节点 n-1 的路径 ,所以只需要从节点0开始找就可以
修改后的代码时间和空间复杂度:(不太好 有空再研究怎么优化!)
再贴一个题解里的BFS方法: (BFS配队列)
class Solution:
def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:
n = len(graph)
q = deque([[0]])
ans = []
while q:
path = q.popleft()
if path[-1] == n - 1:
ans.append(path)
continue
for nxt in graph[path[-1]]:
q.append(path + [nxt])
return ans
以后再遇到图问题求路径会继续记录更新~