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

2021-10-11 19:38:57 字數 1310 閱讀 9470

難度中等656

你這個學期必須選修numcourse門課程,記為0numcourse-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 <= numcourses <= 10^5拓撲排序:

設定乙個arraylist edge 儲存以 i為起點的邊的所有終點,設定乙個indegree儲存入度,即以i為終點的邊的數量。

如果入度為0,存入queue中,

廣度優先遍歷,當i從佇列中poll出後,更新edge[i]中所有點的入度,如果更新後,有點的入度等於0,把它放入佇列中。

直到最後所有點都進入佇列,並排出佇列,則證明圖中沒有換,可以進行拓撲排序。

時間複雜度:o(n+m) n:節點的個數,m:邊的個數

時間複雜度:o(n+m)

class solution {

public boolean canfinish(int numcourses, int prerequisites) {

listedge=new arraylist[numcourses];//edge[i]以i為起點的邊

int indegree=new int[numcourses];//入度

arrays.fill(indegree,0);

for(int i=0;ique=new linkedlist();

for(int i=0;i拓撲排序真的簡單,,,

當然,我有一篇部落格講拓撲排序比較詳細,可以參考。

LeetCode 拓撲排序 207 課程表

難度中等 你這個學期必須選修 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,...