日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 207. 课程表(拓扑排序)

發(fā)布時間:2024/7/5 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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é)點是否都入隊了即可
class Solution { public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {unordered_map<int,unordered_set<int>> m;vector<int> indegree(numCourses,0);for(auto& pre : prerequisites){m[pre[1]].insert(pre[0]);//完成1后,才能完成0indegree[pre[0]]++;}queue<int> q;//入度為0的入隊for(int i = 0; i < numCourses; ++i)if(indegree[i] == 0)q.push(i);int finish = 0, tp;while(!q.empty()){tp = q.front();//tp完成了,依賴其的,入度都-1finish++;q.pop();for(auto id : m[tp]){indegree[id]--;if(indegree[id]==0){q.push(id);}}}return finish == numCourses;} };

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。