題目在此 210. Course Schedule II
給定一系列的課程與先修課程,請給出沒有衝突的修課順序
解題思維
如果你沒解過第一題可以先看一下 LeetCode 筆記 - 207. Course Schedule
這題本質上一樣是在判斷是否有 cycle
存在,詳見 Cycle detection
那我們可以使用 Depth First Search 來處理這個問題
搜尋方向是由課程往先修課程前進,而最頂的先修課程必定會先結束 Depth First Search
所以就按照結束的順序,將課程收集起來即可,程式碼則是跟第一題一樣,只是多了一個 result
來收集結果。
程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Solution: def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]: cache = collections.defaultdict(list)
for a, b in prerequisites: cache[a].append(b)
visited = set() result = [] def dfs(index, cycle): if index in cycle: return False
if index in visited: return True visited.add(index)
cycle.add(index)
cur_prerequisites = cache[index]
for i in cur_prerequisites: if not dfs(i, cycle): return False cycle.remove(index)
result.append(index) return True
for i in range(numCourses): if not dfs(i, set()): return []
return result
|
也許你也會想看看