返回
深入解析 LeetCode 2050. Parallel Courses III(Python)**
后端
2023-11-30 05:43:28
平行课程 III
在 LeetCode 的 2050. Parallel Courses III 题目中,我们面临一个安排课程学习顺序的难题。每门课程都有一定的先修课程,而我们的目标是安排学习顺序,使得可以同时学习尽可能多的课程。
广度优先搜索 (BFS)
为了解决这个问题,我们将使用广度优先搜索 (BFS) 算法,它可以有效地探索图形结构。BFS 算法从一个初始节点开始,逐层遍历图形,直到访问所有可达的节点。
Python 解决方案
from collections import deque
from typing import List
def max_courses(n: int, prerequisites: List[List[int]]) -> int:
# 初始化入度表和邻接表
indegree = [0] * n
graph = [[] for _ in range(n)]
# 构建邻接表和入度表
for pair in prerequisites:
to, from_ = pair
graph[from_].append(to)
indegree[to] += 1
# 初始化队列和结果计数器
queue = deque([i for i in range(n) if indegree[i] == 0])
count = 0
# BFS 遍历
while queue:
curr = queue.popleft()
count += 1
# 遍历当前节点的邻居,并减少它们的入度
for neighbor in graph[curr]:
indegree[neighbor] -= 1
if indegree[neighbor] == 0:
queue.append(neighbor)
return count
代码解释
-
构建邻接表和入度表: 首先,我们初始化一个大小为 n 的入度表和一个大小为 n 的邻接表。然后,遍历先修课程列表,为每个课程对构建邻接表和更新入度表。
-
初始化队列和结果计数器: 我们使用 deque 初始化一个队列,将入度为 0 的课程添加到其中。此外,我们初始化一个结果计数器,以跟踪可以同时学习的课程数。
-
BFS 遍历: 我们从队列中弹出当前节点,更新结果计数器,然后遍历当前节点的邻居。对于每个邻居,我们减少其入度,并将其添加到队列中,如果它的入度变为 0。
-
返回结果: 当队列为空时,算法结束。我们返回结果计数器,表示可以同时学习的课程数。
示例
对于以下输入:
n = 3
prerequisites = [[1,0],[2,0],[3,1],[3,2]]
我们的 Python 解决方案将输出:2 ,因为我们可以同时学习课程 0 和 2。
总结
通过使用 BFS 算法,我们可以有效地遍历课程依赖关系图。这种方法使我们能够确定可以同时学习的课程数,从而优化学习顺序。本教程提供了 LeetCode 2050. Parallel Courses III Python 解法的详细解释,帮助您掌握 BFS 算法在解决此类问题中的应用。