207. Course Schedule
題目網址:https://leetcode.cn/problems/course-schedule/
題意:你這學期必須選修
numCourses
門課程, 標記為0
到numCourses - 1
。在修習某些課程前需要一些先修課程
prerequisites
, 其中prerequisites[i] = [a_i, b_i]
, 表示要修a_i
前必須先修b_i
。
- e.g.
[0, 1]
表示想要修課程0
, 需要先完成課程1
。返回是否能完成所有課程。
Solution 1:
想法:利用 Topological Sort + BFS, 依序取出
inDegree = 0
之 node在 BFS 中,
[0, 1]
表示想要修課程0
, 需要先完成課程1
。
用圖表示為1
指向0
(方向跟 DFS 相反), 這樣1
的inDegree = 0
, 才會優先被執行
- 首先將
inDegree = 0
的 node(不需要任何先修課程的課)加入到 queue 中- BFS
- 取出
queue.front()
後, 將其相鄰 node 的inDegree - 1
- 若相鄰 node 之
inDegree - 1
後為0
, 則將該 node push 到 queue 中- 特殊情況:若 Graph 有 cycle
不會有任何 node 加入到 queue 中(所有 node 之 inDegree 皆不為 0), 故要用一變數
visited
紀錄inDegree = 0
的個數當 queue 取出 front 時
visited + 1
, 因為 queue 中的 node 一定是inDegree = 0
的 node最後判斷
visited
是否等於numCourses
class Solution { |
- time:$O(n + m)$ ➔
n
為課程數(vertex),m
為先修課程數(edge)。其實就是對圖進行 BFS 所需之時間複雜度 $O(V+E)$ - space:$O(n + m)$ ➔ 因為
adj
為 $O(V + E)$,V
是因為要記錄所有點,E
是因為會記錄所有邊
Solution 2:
想法:利用 Topological Sort + DFS, 其實本題就是在問有向圖中是否有 cycle。此外也要考慮存在 isolated node 的情況(也就是 Graph 非 connected, 如下圖中的 3)
e.g. 下圖中
(0, 1, 5)
為 cycle, 故返回 false
在 DFS 中,
[0, 1]
表示想要修課程0
, 需要先完成課程1
。用圖表示為0
指向1
class Solution { |
- time:$O(n + m)$ ➔
n
為課程數(vertex),m
為先修課程數(edge)。其實就是對圖進行 DFS 所需之時間複雜度 $O(V+E)$ - space:$O(n + m)$ ➔ 因為
adj
為 $O(V+E)$,V
是因為要記錄所有點,E
是因為會記錄所有邊
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論