返回

征服 LeetCode 207:巧用拓扑排序,攻克课程表

前端

导言

踏入学术殿堂,莘莘学子难免会面对课程选择的难题。如何合理安排课程,满足先修要求,避免时间冲突,成为一项令人头疼的挑战。本篇文章将结合 LeetCode 207 题:课程表,带领你深入了解拓扑排序算法,巧妙化解这一难题。

拓扑排序

拓扑排序是一种用于对有向无环图(DAG)进行排序的算法。在有向图中,顶点表示课程,而边表示先修关系。拓扑排序的目的是找到一个线性序列,使得对于图中任意一条边 (u, v),课程 u 都排在课程 v 之前。

算法步骤

拓扑排序算法的步骤如下:

  1. 初始化 :将所有课程入度(即指向该课程的边的数量)设为 0。
  2. 查找入度为 0 的课程 :从图中找到所有入度为 0 的课程。
  3. 输出并删除课程 :输出找到的课程,并从图中删除该课程及其所有出边。
  4. 更新入度 :对于图中所有被删除课程的出边所指向的课程,将它们的入度减 1。
  5. 重复步骤 2-4 :直到所有课程都被输出或图中没有课程为止。

LeetCode 207 题解

LeetCode 207 题要求我们判断是否可以完成所有课程,而不会陷入先修冲突的循环中。我们可以使用拓扑排序算法来解决这个问题:

  1. 构建有向图 :根据课程先修关系构建一个有向图,其中课程为顶点,先修关系为边。
  2. 计算入度 :计算每个课程的入度。
  3. 拓扑排序 :使用拓扑排序算法对图进行排序。
  4. 判断结果 :如果成功对所有课程进行拓扑排序,则说明可以完成所有课程;否则,则无法完成。

代码实现

def canFinish(numCourses, prerequisites):
    # 初始化入度数组
    in_degree = [0] * numCourses

    # 构建有向图
    graph = defaultdict(list)
    for course, prereq in prerequisites:
        graph[prereq].append(course)
        in_degree[course] += 1

    # 拓扑排序
    queue = [course for course in range(numCourses) if in_degree[course] == 0]
    while queue:
        course = queue.pop(0)
        numCourses -= 1
        for next_course in graph[course]:
            in_degree[next_course] -= 1
            if in_degree[next_course] == 0:
                queue.append(next_course)

    # 判断结果
    return numCourses == 0

总结

通过 LeetCode 207 题的讲解,我们深入了解了拓扑排序算法在解决课程表问题中的应用。拓扑排序是一种高效且实用的算法,不仅可以用于解决课程表问题,还可以应用于其他涉及有向无环图的场景中。掌握拓扑排序算法,为你的编程技能锦上添花,轻松应对各种编程难题。