210. 课程表 II

210. 课程表 II

  • 题目-中等难度
  • 示例
  • 1. bfs

题目-中等难度

现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] = [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。

例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示:[0,1] 。
返回你为了学完所有课程所安排的学习顺序。可能会有多个正确的顺序,你只要返回 任意一种 就可以了。如果不可能完成所有课程,返回 一个空数组 。

示例

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:[0,1]
解释:总共有 2 门课程。要学习课程 1,你需要先完成课程 0。因此,正确的课程顺序为 [0,1] 。

示例 2:

输入:numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
输出:[0,2,1,3]
解释:总共有 4 门课程。要学习课程 3,你应该先完成课程 1 和课程 2。并且课程 1 和课程 2 都应该排在课程 0 之后。
因此,一个正确的课程顺序是 [0,1,2,3] 。另一个正确的排序是 [0,2,1,3] 。

示例 3:

输入:numCourses = 1, prerequisites = []
输出:[0]

提示:

  • 1 <= numCourses <= 2000
  • 0 <= prerequisites.length <= numCourses * (numCourses - 1)
  • prerequisites[i].length == 2
  • 0 <= ai, bi < numCourses
  • ai != bi
  • 所有[ai, bi] 互不相同

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/summary-ranges
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1. bfs

时间
44ms
击败 89.86%使用 Python3 的用户
内存
16.93MB
击败 56.86%使用 Python3 的用户

class Solution:
    def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
        # 初始化需要完成的课程
        deg = [0] * numCourses
        # 字典存储课程关联的先决条件
        dic = defaultdict(list)
        # 将需要完成的课程添加到deg, 将完成条件添加到dic键, 关联的值为键上课程完成后可学的课程 
        for ai,bi in prerequisites:
            deg[ai] += 1
            dic[bi].append(ai)
        # li放入未在deg上的课程, 作为可以第一个完成的课程
        li = [i for i,j in enumerate(deg) if j == 0]
        # 列表存储课程
        res = []
        # 当仍然有课程可以完成
        while li:
            # 获取该课程
            a = li.pop(0)
            # 添加到res列表
            res.append(a)
            # 遍历完成课程后完成的后续课程
            for i in dic[a]:
                # 将后续课程在deg中的值-1
                deg[i] -= 1
                # 当课程在deg中值为0, 代表该课程可以标记为已完成课程
                if deg[i] == 0:
                    li.append(i)
        # 如果最终课程数量与给与的课程数量相同, 返回res, 不然为空
        return res if len(res) == numCourses else []
                

你可能感兴趣的:(图,算法,算法,图,python,leetcode)