【Leetcode】python - [210] Course Schedule II 個人解法筆記

題目出處

210. Course Schedule II

難度

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

算法說明

  • 此問題的前一個問題,主要差別是在有沒有要求輸出一個明確的結果,可以參考: https://wongwongnotes-github-io.pages.dev/python/leetcode-python-207/
  • 這題考的是 BFS 中的拓樸排序法,個人認為比較難的是在 graph 操作的部分,其他的概念相對來說還好。

    另外處理 start_courses ,去尋找 indegree 為 0 的 node

    最近在練習程式碼本身就可以自解釋的 Coding style,可以嘗試直接閱讀程式碼理解

    input handling

    • 如果 Graph 有 loop,會導致無法上完全部課程,此時回傳 []

    Boundary conditions

    當 queue 為空時,結束迴圈,並判斷是否上完全部課程。

    Reference