课程表—leetcode207
生活随笔
收集整理的這篇文章主要介紹了
课程表—leetcode207
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
你這個學期必須選修 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
思路:判斷有向無環(huán)圖,BFS
先把圖畫出來,用二維數(shù)組,relationMap[i][j]表示從i到j(luò)是不是依賴關(guān)系,并且算出每個節(jié)點的入度數(shù),即每個課程依賴課程的數(shù)量,之后再去用BFS判斷是否存在環(huán)
class Solution { public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {if(prerequisites.empty())return true;int result = 0;vector<int> counts(numCourses,0);vector<vector<int>> relationMap(numCourses,vector<int>(numCourses));for(int i=0;i<prerequisites.size();++i){relationMap[prerequisites[i][1]][prerequisites[i][0]] = 1;counts[prerequisites[i][0]] +=1;}queue<int> que;for(int i=0;i<numCourses;++i){if(counts[i]==0){que.push(i);result++;}}while(!que.empty()){int top = que.front();que.pop();for(int i=0;i<numCourses;++i){if(relationMap[top][i]==1){counts[i]--;if(counts[i]==0){que.push(i);result++;}}}}return result==numCourses?true:false;} };?
總結(jié)
以上是生活随笔為你收集整理的课程表—leetcode207的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 反转链表—leetcode206
- 下一篇: 翻转二叉树—leetcode226