这是我从leetcode解决课程安排问题的方法。我正在寻找任何改进我的代码的建议,即使是最细微的建议。
这是问题:
您总共必须学习n门课程,从0到n-1标记。
某些课程可能具有先决条件,例如,要学习课程0,您必须首先学习课程1,该课程以成对表达:[0,1]
给出课程总数和先决条件对列表,返回完成所有课程应采取的课程顺序。
可能有多个正确的订单,您只需要返回其中一个即可。如果不可能完成所有课程,则返回一个空数组。
示例1:
输入:2,[[1,0]] 输出:[0,1] 说明:总共有2门课程可供选择。要选择课程1,您应该已经完成课程0。因此正确的课程顺序是[0,1]。 示例2:
输入:4,[[1,0],[2,0],[3,1],[3,2]] 输出:[0,1,2,3]或[0,2,1,3] 说明:总共有4门课程。参加课程3时,您应该同时修完课程1和2。课程1和2都应该在完成课程0之后上课。因此,正确的课程顺序是[0,1,2,3]。另一个正确的顺序是[0,2,1,3]。
这是我的解决方案: 类解决方案: def findOrder(self,numCourses,前提条件):
"""
:type numCourses: int
:type prerequisites: List[List[int]]
:rtype: bool
"""
#Convert prerequisites into an adjacency list
adj = []
for i in range(numCourses):
adj.append(set())
for pair in prerequisites:
adj[pair[0]].add(pair[1])
def DFSHelper(s):
visited.add(s)
stack.add(s)
for neighbor in adj[s]:
# if neighbor vertex has never been visted before, there is no way it could be a backedge.
# visit this unvisited vertex
if(neighbor not in visited):
if(not DFSHelper(neighbor)):
return False
Sorted.append(neighbor)
else:
if(neighbor in stack):
return False
stack.remove(s)
return True
visited = set()
stack = set()
Sorted = []
for j in range(len(adj)):
if(j not in visited):
if(not DFSHelper(j)):
print(j)
return []
Sorted.append(j)
return Sorted
我首先将给定的先决条件列表转换为图的邻接列表表示形式,然后对图进行拓扑排序。我递归使用DFS对图进行拓扑排序。排序列表存储排序结果。在执行DFS时,我还检查了图形是否包含任何循环,如果它只是返回[]。为了检查周期,我维护了一个称为堆栈的集合,该集合存储了当前在调用堆栈中的所有顶点。