Leetcode的课程安排

时间:2018-07-06 09:17:19

标签: graph topological-sort

这是我从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时,我还检查了图形是否包含任何循环,如果它只是返回[]。为了检查周期,我维护了一个称为堆栈的集合,该集合存储了当前在调用堆栈中的所有顶点。

0 个答案:

没有答案