題目出處
難度
medium
個人範例程式碼
class Solution:
def findOrder(self, numCourses: int, prerequisites: List[List[int]]) -> List[int]:
return self.bfs(numCourses, prerequisites)
def bfs(self, num_courses, prerequisites):
next_courses, indegree = self.get_indegree(num_courses, prerequisites)
start_courses = [course for course, degree in indegree.items() if degree == 0]
learned_courses = []
queue = collections.deque(start_courses)
visited = set()
while queue:
course = queue.popleft()
learned_courses.append(course)
visited.add(course)
for next_course in next_courses[course]:
indegree[next_course] -= 1
if indegree[next_course] == 0 and next_course not in visited:
queue.append(next_course)
else:
return learned_courses if num_courses == len(learned_courses) else []
def get_indegree(self, num_courses, prerequisites):
next_courses = {x:[] for x in range(num_courses)}
indegree = {x:0 for x in range(num_courses)}
for course, next_course in prerequisites:
next_courses[next_course].append(course)
indegree[course] += 1
# print(next_courses, indegree)
return next_courses, indegree
算法說明
這題考的是 BFS 中的拓樸排序法,個人認為比較難的是在 graph 操作的部分,其他的概念相對來說還好。
另外處理 start_courses ,去尋找 indegree 為 0 的 node
最近在練習程式碼本身就可以自解釋的 Coding style,可以嘗試直接閱讀程式碼理解
input handling
- 如果 Graph 有 loop,會導致無法上完全部課程,此時回傳 []
Boundary conditions
當 queue 為空時,結束迴圈,並判斷是否上完全部課程。