トピック
これで、合計 n 個のコースを選択できるようになり、0 ~ n-1 として記録されます。
特定のコースを受講する前に、いくつかの前提条件コースが必要です。たとえば、コース 0 を学習するには、まずコース 1 を完了する必要があります。これらを [0,1] の一致で表します。
コースの総数とその前提条件を考慮して、すべてのコースを受講する順序を返します。
正しいシーケンスが複数ある場合がありますが、1 つを返すだけで済みます。すべてのコースを完了できない場合は、空の配列が返されます。
例証します:
1. 入力前提条件は、隣接行列ではなく、エッジ リストで表されるグラフです。詳細については、図の表現を参照してください。
2. 入力前提条件には重複するエッジがないと仮定できます。
ヒント:
1. この問題は、有向グラフにサイクルが存在するかどうかを見つけることと同じです。ループがある場合、位相的ソートが行われないため、すべてのコースを学習のために選択することはできません。
2. DFS によるトポロジカル ソート - Coursera の素晴らしいビデオ チュートリアル (21 分)。トポロジカル ソートの基本概念を紹介します。
3. トポロジカル ソートは BFS を通じて実行することもできます。
アイデア:
LeetCode-Python-207 に似ています。トポロジカル ソートを使用して実装されたカリキュラム。
正常に実行されるコード
class Solution(object):
def findOrder(self, numCourses, prerequisites):
"""
:type numCourses: int
:type prerequisites: List[List[int]]
:rtype: List[int]
"""
if not prerequisites:
return [i for i in range(numCourses)]
indegree = [0 for _ in range(numCourses)]
adj = [set() for _ in range(numCourses)]
for end, start in prerequisites:
indegree[end] += 1
adj[start].add(end)
from collections import deque
queue = deque()
for i, x in enumerate(indegree):
if not x:
queue.append(i)
res = []
while queue:
cur = queue.popleft()
res.append(cur)
for neighbor in adj[cur]:
indegree[neighbor] -= 1
if indegree[neighbor] == 0:
queue.append(neighbor)
return res if len(res) == numCourses else []