從今天開始 接下來的幾個月 裡我都在這裡分享leecode解題思路和藍橋杯歷屆試題的解題思路 。。。
第一天先看乙個dfs的題目 :
現在你總共有 n 門課需要選,記為 0 到 n-1。我們一看到這樣的題目,基本上都是dfs的型別,所有dfs的題目都可以用圖來表示的,這個題目用圖表示再好不過了,在選修某些課程之前需要一些先修課程。 例如,想要學習課程 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. 有一點我們必須要知道,怎麼樣才能算完成不了課程?
我們可以清晰的發現,當乙個課程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...