LeetCode 207. 课程表(拓扑排序)
生活随笔
收集整理的這篇文章主要介紹了
LeetCode 207. 课程表(拓扑排序)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 題目
你這個學期必須選修 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。這是不可能的。提示: 輸入的先決條件是由 邊緣列表 表示的圖形,而不是 鄰接矩陣 。詳情請參見圖的表示法。 你可以假定輸入的先決條件中沒有重復的邊。 1 <= numCourses <= 10^5來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/course-schedule
著作權歸領扣網(wǎng)絡所有。商業(yè)轉載請聯(lián)系官方授權,非商業(yè)轉載請注明出處。
2. 解題
參考:圖Graph–拓撲排序(Topological Sorting)
類似題目:LeetCode 210. 課程表 II(拓撲排序)
2.1 廣度優(yōu)先
- 找到入度為0的先開始學習,入隊
- 跟其連接的節(jié)點,入度-1,入度為零時,可以入隊
- 返回所有節(jié)點是否都入隊了即可
40 ms 14 MB
2.2 深度優(yōu)先
class Solution {unordered_map<int,unordered_set<int>> m;enum {todo, doing, done}; public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) { vector<int> visited(numCourses,0);for(auto& pre : prerequisites)m[pre[1]].insert(pre[0]);//完成1后,才能完成0bool can = true;for(int i = 0; i < numCourses; ++i){dfs(i, visited, can);if(!can)break;}return can;}void dfs(int i, vector<int> &visited, bool& can){if(!can) return;if(visited[i]==done)return;if(visited[i]==doing)//還沒done,又出現(xiàn)了doing,出現(xiàn)環(huán){can = false;return;}visited[i] = doing;//進入下一個要做的之前是doing狀態(tài)for(auto id : m[i]){dfs(id, visited, can);}visited[i] = done;//往回走的時候狀態(tài)做完了} };44 ms 14.4 MB
總結
以上是生活随笔為你收集整理的LeetCode 207. 课程表(拓扑排序)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1291. 顺次数(模
- 下一篇: LeetCode 681. 最近时刻