LeetCode 拓撲排序 207 課程表

2021-10-05 19:12:44 字數 1706 閱讀 9728

難度中等

你這個學期必須選修 numcourse 門課程,記為 0 到 numcourse-1 。

在選修某些課程之前需要一些先修課程。 例如,想要學習課程 0 ,你需要先完成課程 1 ,我們用乙個匹配來表示他們:[0,1]

給定課程總量以及它們的先決條件,請你判斷是否可能完成所有課程的學習?

示例1:

輸入: 2, [[1,0]]

輸出: true

解釋: 總共有 2 門課程。學習課程 1 之前,你需要完成課程 0。所以這是可能的。

示例2:

輸入: 2, [[1,0],[0,1]]

輸出: false

解釋: 總共有 2 門課程。學習課程 1 之前,你需要先完成​課程 0;並且學習課程 0 之前,你還應先完成課程 1。這是不可能的。

1.輸入的先決條件是由 邊緣列表 表示的圖形,而不是 鄰接矩陣 。詳情請參見圖的表示法。

2.你可以假定輸入的先決條件中沒有重複的邊。

3.1 <= numcourses <= 10^5

解題思路:

本題可約化為: 課程安排圖是否是 有向無環圖(dag)。即課程間規定了前置條件,但不能構成任何環路,否則課程前置條件將不成立。

思路是通過 拓撲排序 判斷此課程安排圖是否是 有向無環圖(dag) 。 拓撲排序原理: 對 dag 的頂點進行排序,使得對每一條有向邊 (u, v)(u,v),均有 uu(在排序記錄中)比 vv 先出現。亦可理解為對某點 vv 而言,只有當 vv 的所有源點均出現了,vv 才能出現。

通過課程前置條件列表 prerequisites 可以得到課程安排圖的 鄰接表 adjacency,以降低演算法時間複雜度,以下兩種方法都會用到鄰接表。

資料結構:

演算法:

1.統計課程安排圖中每個節點的入度,生成 入度表 indegrees。

2.借助乙個佇列 queue,將所有入度為 00 的節點入隊。

3.當 queue 非空時,依次將隊首節點出隊,在課程安排圖中刪除此節點 pre:

4.在每次 pre 出隊時,執行 numcourses–;

複雜度分析:

時間複雜度 o(n + m)o(n+m): 遍歷乙個圖需要訪問所有節點和所有臨邊,nn 和 mm 分別為節點數量和臨邊數量;

空間複雜度 o(n + m)o(n+m): 為建立鄰接表所需額外空間,adjacency 長度為 nn ,並儲存 mm 條臨邊的資料。

class

solution

// get all the courses with the indegree of 0.

for(

int i =

0; i < numcourses; i++)if

(indegrees[i]==0

) queue.

add(i)

;// bfs topsort.

while

(!queue.

isempty()

)return numcourses ==0;

}}

《拓撲排序》207 課程表《leetcode》

難度中等656 你這個學期必須選修numcourse門課程,記為0到numcourse 1。在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,請你判斷是否可能完成所有課程的學習?示例 1 輸入 2,1,...

LeetCode 207 課程表(拓撲排序)

你這個學期必須選修 numcourse 門課程,記為 0 到 numcourse 1 在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,請你判斷是否可能完成所有課程的學習?示例 1 輸入 2,1,0 輸...

leetcode207 課程表與拓撲排序

簡單講就是,在乙個排序中,某些元素的存在依賴於另外的元素。或者說某些元素必須排在另外的元素後面。比如說,穿衣服的時候,必須先穿褲衩,再穿秋褲,然後是棉褲和套在最外層的運動褲。而上身的背心和褲衩則沒有依賴關係。1.廣度優先 簡單來講,就是始終把每次將入度為0的頂點去掉。所以排序的結果就是 1,2,3,...