Leetcode--210.课程表Ⅱ
現(xiàn)在你總共有 n 門課需要選,記為?0?到?n-1。
在選修某些課程之前需要一些先修課程。?例如,想要學(xué)習(xí)課程 0 ,你需要先完成課程?1 ,我們用一個匹配來表示他們: [0,1]
給定課程總量以及它們的先決條件,返回你為了學(xué)完所有課程所安排的學(xué)習(xí)順序。
可能會有多個正確的順序,你只要返回一種就可以了。如果不可能完成所有課程,返回一個空數(shù)組。
示例?1:
輸入: 2, [[1,0]]?
輸出: [0,1]
解釋:?總共有 2 門課程。要學(xué)習(xí)課程 1,你需要先完成課程 0。因此,正確的課程順序為 [0,1] 。
示例?2:
輸入: 4, [[1,0],[2,0],[3,1],[3,2]]
輸出: [0,1,2,3] or [0,2,1,3]
解釋:?總共有 4 門課程。要學(xué)習(xí)課程 3,你應(yīng)該先完成課程 1 和課程 2。并且課程 1 和課程 2 都應(yīng)該排在課程 0 之后。
?? ? 因此,一個正確的課程順序是?[0,1,2,3] 。另一個正確的排序是?[0,2,1,3] 。
說明:
輸入的先決條件是由邊緣列表表示的圖形,而不是鄰接矩陣。詳情請參見圖的表示法。
你可以假定輸入的先決條件中沒有重復(fù)的邊。
提示:
這個問題相當(dāng)于查找一個循環(huán)是否存在于有向圖中。如果存在循環(huán),則不存在拓?fù)渑判?#xff0c;因此不可能選取所有課程進行學(xué)習(xí)。
通過 DFS 進行拓?fù)渑判?- 一個關(guān)于Coursera的精彩視頻教程(21分鐘),介紹拓?fù)渑判虻幕靖拍睢?br /> 拓?fù)渑判蛞部梢酝ㄟ^?BFS?完成。
?
思路:拓?fù)渑判?/p>
?
代碼:
class?Solution?{
????public?int[]?findOrder(int?numCourses,?int[][]?prerequisites)?{
????????List<Integer>?lists[]?=?new?ArrayList[numCourses];//記錄某個節(jié)點可以到達(dá)的節(jié)點集合
????????int?invalue[]?=?new?int[numCourses];//記錄每個節(jié)點的入度
????????for(int?i=0;i<prerequisites.length;i++){
????????????invalue[prerequisites[i][0]]++;
????????????if(lists[prerequisites[i][1]]==null){
????????????????lists[prerequisites[i][1]]?=?new?ArrayList<>();
????????????}
????????????lists[prerequisites[i][1]].add(prerequisites[i][0]);
????????}
????????Queue<Integer>?queue?=?new?LinkedList<>();
????????for(int?i=0;i<numCourses;i++){
????????????if(invalue[i]==0){
????????????????queue.add(i);
????????????}
????????}
????????int?result[]?=?new?int[numCourses];
????????int?count=0;
????????while(!queue.isEmpty()){
????????????int?size?=?queue.size();
????????????while(size-->0){
????????????????int?t?=?queue.poll();
????????????????result[count++]=t;
????????????????if(lists[t]==null)?continue;
????????????????for(int?i=0;i<lists[t].size();i++){
????????????????????invalue[lists[t].get(i)]--;
????????????????????if(invalue[lists[t].get(i)]==0){
????????????????????????queue.add(lists[t].get(i));
????????????????????}
????????????????}
????????????}
????????}
????????if(count==numCourses)?return?result;
????????else?return?new?int[0];
?
????}
}
總結(jié)
以上是生活随笔為你收集整理的Leetcode--210.课程表Ⅱ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode--120. 三角形最小
- 下一篇: HashSet源码解析(最好先看Hash