LeetCode 207. 課程表

1、題目

課程表 - 力扣(LeetCode) https://leetcode-cn.com/problems/course-schedule/

2、題解

這道題的思路其實很簡單,排除了不滿足的情況自然就滿足了
首先,如果學(xué)習(xí)次數(shù)少于課程數(shù)量,就一定不能滿足
其次,如果將各個課程看成一個個的節(jié)點,節(jié)點的先決關(guān)系就是兩點之間的連線,而且是有方向的連線。這樣就課程和課程之間的關(guān)系就形成了一個有向圖。但凡有向圖中有兩點間存在方向相反的兩條線,即A->B 且B->A成立,那么基于類似死鎖這樣的情況,我們就無法學(xué)完當前的課程。
那么我們只需要判斷當前數(shù)據(jù)代表的有向圖是否存在環(huán)即可;

3、代碼

 public class Solution {

        public boolean canFinish(int numCourses, int[][] prerequisites) {
            int[] inDegree = new int[numCourses];
            int[][] graph = new int[numCourses][numCourses];
            for(int i = 0; i < prerequisites.length; i++){
                graph[prerequisites[i][1]][prerequisites[i][0]] = 1;
                inDegree[prerequisites[i][0]]++;
            }
            //定義一個隊列Q,并把所有入度為0的節(jié)點加入隊列。
            Queue<Integer> queue = new LinkedList<>();
            for(int i = 0; i < numCourses; i++){
                if(inDegree[i] == 0){
                    queue.add(i);
                }
            }
            //取隊首節(jié)點,輸出。然后刪去所有從它出發(fā)的邊,并令這些邊到達的頂點的入度減1,如果某個頂點的入度減為0,則將其加入隊列。
            int num = 0;
            while(!queue.isEmpty()){
                int u = queue.poll();
                for(int v = 0; v < numCourses; v++){
                    if(graph[u][v] != 0){
                        inDegree[v]--;
                        if(inDegree[v] == 0){
                            queue.add(v);
                        }
                    }
                }
                num++;
            }
            return num == numCourses;
        }
    }

4、執(zhí)行結(jié)果

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容