LeetCode 210 课程表 II

1、题目

两个数组numCourses和prerequisites,numCourses表示一共有0到numCourses-1的课程,prerequisites所有元素都是二维数组,每一个二维数组表示课程的先修后修关系,二维数据的第一个元素表示修这个课程的前提需要先修第二个元素所表示的课程。
最后返回所有课程的学习顺序,可能有多个正确的顺序,返回一个即可

2、思路

这个学习顺序可表示成一个有向图,这个图表示了所有课程的学习顺序,如果这个有向图形成了环,则说明没有正确的学习顺序

3、数据

  1. is_ring:这个表示这个有向图是不是一个环
  2. visited:表示这个课程有没有记录学习顺序
  3. res:最终的输出结果,将课程顺序从第一个到最后一个一次添加到这个list中
  4. edges:将所有的先修课程都放进去作为一个键,这个先修课程所对应的后修课程全部保存在一个list中,作为list的值

4、代码

def findOrder(self, numCourses, prerequisites):
        res = []
        is_ring = False
        visited = [0]*numCourses
        edges = collections.defaultdict(list)
        for cur_prerequisites in prerequisites:
            edges[cur_prerequisites[1]].append(cur_prerequisites[0])
        def deep_first_search(i):
            nonlocal is_ring
            visited[i] = 1
            for follow_course in edges[i]:
                if visited[follow_course] == 0:
                    deep_first_search(follow_course)
                    if is_ring:
                        return
                elif visited[follow_course] == 1:
                    is_ring = True
                    return
            visited[i] = 2
            res.append(i)
        for i in range(numCourses):
            if is_ring:
                break
            if visited[i]==0:
                deep_first_search(i)
        if is_ring:
            return []
        return res[::-1]

你可能感兴趣的:(leetcode,算法,职场和发展)