返回
征服 LeetCode 207:巧用拓扑排序,攻克课程表
前端
2024-01-02 15:58:21
导言
踏入学术殿堂,莘莘学子难免会面对课程选择的难题。如何合理安排课程,满足先修要求,避免时间冲突,成为一项令人头疼的挑战。本篇文章将结合 LeetCode 207 题:课程表,带领你深入了解拓扑排序算法,巧妙化解这一难题。
拓扑排序
拓扑排序是一种用于对有向无环图(DAG)进行排序的算法。在有向图中,顶点表示课程,而边表示先修关系。拓扑排序的目的是找到一个线性序列,使得对于图中任意一条边 (u, v),课程 u 都排在课程 v 之前。
算法步骤
拓扑排序算法的步骤如下:
- 初始化 :将所有课程入度(即指向该课程的边的数量)设为 0。
- 查找入度为 0 的课程 :从图中找到所有入度为 0 的课程。
- 输出并删除课程 :输出找到的课程,并从图中删除该课程及其所有出边。
- 更新入度 :对于图中所有被删除课程的出边所指向的课程,将它们的入度减 1。
- 重复步骤 2-4 :直到所有课程都被输出或图中没有课程为止。
LeetCode 207 题解
LeetCode 207 题要求我们判断是否可以完成所有课程,而不会陷入先修冲突的循环中。我们可以使用拓扑排序算法来解决这个问题:
- 构建有向图 :根据课程先修关系构建一个有向图,其中课程为顶点,先修关系为边。
- 计算入度 :计算每个课程的入度。
- 拓扑排序 :使用拓扑排序算法对图进行排序。
- 判断结果 :如果成功对所有课程进行拓扑排序,则说明可以完成所有课程;否则,则无法完成。
代码实现
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 题的讲解,我们深入了解了拓扑排序算法在解决课程表问题中的应用。拓扑排序是一种高效且实用的算法,不仅可以用于解决课程表问题,还可以应用于其他涉及有向无环图的场景中。掌握拓扑排序算法,为你的编程技能锦上添花,轻松应对各种编程难题。