課程表 演算法設計

2021-10-01 11:36:51 字數 1846 閱讀 8424

從今天開始 接下來的幾個月 裡我都在這裡分享leecode解題思路和藍橋杯歷屆試題的解題思路 。。。

第一天先看乙個dfs的題目 :

現在你總共有 n 門課需要選,記為 0 到 n-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。這是不可能的。

我們一看到這樣的題目,基本上都是dfs的型別,所有dfs的題目都可以用圖來表示的,這個題目用圖表示再好不過了,

1. 有一點我們必須要知道,怎麼樣才能算完成不了課程?

我們可以清晰的發現,當乙個課程i 的先行課是j的話,而j的先行課與i又有關係,那我們就完成不了i和j,

舉個例子:課程0的先行課是1,1的先行課是0,這樣就矛盾了,所以我們完成不了課程,

所以我們的思路就是根據題目所給資訊,構造圖,圖的表示方式為鄰接表,對鄰接表進行遍歷,發現如果存在環狀圖,則不行

public

boolean

canfinish

(int numcourses,

int[

] prerequisites)

for(

int[

] temp : prerequisites)

// 因為他可能是好幾個連通圖

// 我們設定遞迴函式 dfs(int i, gra, int mark)

// 遞迴函式的作用是 已從i開始遍歷的極大連通子圖 是否存在環 存在環 則返回true 不存在返回false

int[

] mark =

newint

[numcourses]

;for

(int i =

0; i < numcourses; i++)}

}// 如果每乙個連通子圖都沒有存在環 就說明這個圖 不存在環

return

true;}

// 下面著重寫dfs()函式

// i 表示當前正在訪問哪個節點 mark為標記

// mark[i] == 0 說明這個點沒有被訪問

// mark[i] == 1 說明這個點正在被訪問

// mark[i] == 2 說明這個點已經被訪問完了

private

boolean

dfs(

int i, hashset

gra,

int[

] mark)

// 說明這個點以前已經訪問過了 從這點出發是沒有環存在的 返回false

if(mark[i]==2

)// 當以上兩種 都不符合 說明 mark[i] == 0 說明這個節點還沒走過 那麼我們訪問這個節點

// 看看從這個節點出發有沒有環

mark[i]=1

;// 標記正在訪問 這個極大連通圖

for(

int j : gra[i])}

// 如果從 i的所有鄰接節點都沒有環 那就說明當前圖是沒有環的

mark[i]=2

;return

false

;}

最後leecode顯示通過!

建立課程表設計

create time models.datetimefield 建立時間 auto now add true,null true update time models.datetimefield 更新時間 auto now true,null true title models.charfield...

leetcode 課程表I,課程表II

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

html課程表頁面

效果圖 html 部分 charset utf 8 課程表title align center 課程表h2 caption class info align center valign middle 專案td colspan 5 align center valign middle 上課td col...