LC 210图论中等第 92 / 95 题

课程表 II

Course Schedule II

拓扑排序Kahn 算法
本机进度仅保存在当前浏览器

题目描述

现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给定课程总量和先修关系 prerequisites,返回你为了学完所有课程所安排的学习顺序(可能有多个正确答案,返回任意一种);不可能完成则返回空数组。

示例:numCourses = 4,prerequisites = [[1, 0], [2, 0], [3, 1], [3, 2]],输出 [0, 1, 2, 3](或 [0, 2, 1, 3])。

解题思路

  1. 在第 207 题 Kahn 算法的基础上,把"出队顺序"记录下来就是拓扑序。
  2. 每次从队列取出的节点,其全部先修节点都已输出,因此追加到结果末尾总是合法的。
  3. 结果长度不足 numCourses 说明存在环,按题意返回空数组。

参考实现

查看参考实现Python · 建议先自行作答
from collections import deque

def findOrder(numCourses, prerequisites):
    graph = [[] for _ in range(numCourses)]
    indeg = [0] * numCourses
    for a, b in prerequisites:
        graph[b].append(a)
        indeg[a] += 1
    queue = deque(i for i in range(numCourses) if indeg[i] == 0)
    order = []
    while queue:
        node = queue.popleft()
        order.append(node)
        for nxt in graph[node]:
            indeg[nxt] -= 1
            if indeg[nxt] == 0:
                queue.append(nxt)
    return order if len(order) == numCourses else []

复杂度与归属

时间复杂度O(V + E)
空间复杂度O(V + E)
所属分类图论
题源LeetCode 210

关联教程

返回题图鉴