返回

深入解析 LeetCode 2050. Parallel Courses III(Python)**

后端

平行课程 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 算法在解决此类问题中的应用。