leetcode之課程表

2021-10-07 11:33:10 字數 1609 閱讀 5212

你這個學期必須選修 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 門課程...