你這個學期必須選修 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。這是不可能的。
一起審題
一共有 n 門課要上,編號為 0 ~ n-1
先決條件 [1, 0],代表必須先上課 0 ,才能上課 1
給你 n 和 乙個先決條件表,請你判斷能否完成所有課程
引入有向圖 描述依賴關係
示例:n = 6, 先決條件表:[ [3, 0], [3, 1], [4, 1], [4, 2], [5, 3], [5, 4] ]
0, 1, 2 沒有先修課,可以直接選。其餘的,都要先修 2 門課
我們用 有向圖 描述這種 依賴關係 (做事的先後關係):
把這樣乙個 有向無環圖 變成 線性的排序 就叫 拓撲排序
有向圖 中有 入度 和 出度 概念:
如果存在一條有向邊 a --> b,則這條邊給 a 增加了 1 個出度,給 b 增加了 1 個入度
所以 0、1、2 的 入度為 0。 而 3、4、5 的 入度為 2
不能「跳步」,選你能上的課
選課只能選 入度為 0 的課,因為它不依賴別的課
假設選了 0,導致 依賴 0 的課的入度減小——課 3 的入度由 2 變 1
接著選 1,導致課 3 的入度變 0,課 4 的入度由 2 變 1
接著選 2,導致課 4 的入度變 0,當前 3 和 4 入度為 0
繼續選 入度為 0 的課 …… 直到選不到 入度為 0 的課
入度陣列 和 鄰接表
課的編號是 0 到 n - 1,讓它作為索引,值為課的入度。通過遍歷先決條件表,計算出每門課的初始入度
用雜湊表記錄 依賴關係 (也可以用 鄰接矩陣 ,但它有點大)
key: 課的編號
value: 依賴它的後續課程
怎麼判斷是否能修完所有課?
遍歷完所有的課,如果 仍有課的入度不為 0,它們無法被選,返回false,完成不了所有課程
否則,返回true,最後所有課都能上,能找到一種排序上完所有課
#define n 100010
class solution
}if(ans.size()==0)return true;
return false;}};
leetcode 課程表I,課程表II
課程表 你這個學期必須選修 numcourse 門課程,記為 0 到 numcourse 1 在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,請你判斷是否可能完成所有課程的學習?示例 1 輸入 2,1...
leetcode解題之課程表 II
現在你總共有 n 門課需要選,記為 0 到 n 1。在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,返回你為了學完所有課程所安排的學習順序。可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完...
LeetCode題解 207 課程表
現在你總共有 n 門課需要選,記為 0 到 n 1。在選修某些課程之前需要一些先修課程。例如,想要學習課程 0 你需要先完成課程 1 我們用乙個匹配來表示他們 0,1 給定課程總量以及它們的先決條件,判斷是否可能完成所有課程的學習?示例 1 輸入 2,1,0 輸出 true 解釋 總共有 2 門課程...