615.課程表

描述

現(xiàn)在你總共有 n 門課需要選,記為 0 到 n - 1.
一些課程在修之前需要先修另外的一些課程,比如要學(xué)習(xí)課程 0 你需要先學(xué)習(xí)課程 1 ,表示為[0,1]
給定n門課以及他們的先決條件,判斷是否可能完成所有課程?

樣例

給定 n = 2,先決條件為 [[1,0]] 返回 true
給定 n = 2,先決條件為 [[1,0],[0,1]] 返回 false

代碼

public class Solution {
    /**
     * @param numCourses a total of n courses
     * @param prerequisites a list of prerequisite pairs
     * @return true if can finish all courses or false
     */
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        // edges用來存儲每一門課程對應(yīng)的所有后續(xù)課程
        // 此處新建edges的寫法要注意
        List[] edges = new ArrayList[numCourses];
        int[] degree = new int[numCourses];
        
        // edges[i]本身就是一個動態(tài)數(shù)組,初始化edges
        for (int i = 0;i < numCourses; i++)
            edges[i] = new ArrayList<Integer>();
            
        for (int i = 0; i < prerequisites.length; i++) {
            // 題目給出的prerequisites[i][1]是先修課程,prerequisites[i][0]是后續(xù)課程
            // 統(tǒng)計學(xué)習(xí)某門課需要先修的課程數(shù)目,即入度
            degree[prerequisites[i][0]]++ ;
            // 即把某門課的后續(xù)課程全部加入到該課對應(yīng)的edges數(shù)組中
            edges[prerequisites[i][1]].add(prerequisites[i][0]);
        }
        
        // degree數(shù)組中i代表的的是某一門課程
        // 把度為0的課程加入隊列
        Queue queue = new LinkedList();
        for(int i = 0; i < degree.length; i++){
            if (degree[i] == 0) {
                queue.add(i);
            }
        }
        
        int count = 0;
        while(!queue.isEmpty()){
            // 隊列里存儲的是Integer
            int course = (int)queue.poll();
            count ++;
            // n代表當(dāng)前課程的后續(xù)課程的數(shù)目
            int n = edges[course].size();
            // 每處理一門課程,該課程的后續(xù)課程的度都要-1
            for(int i = 0; i < n; i++){
                int pointer = (int)edges[course].get(i);
                degree[pointer]--;
                if (degree[pointer] == 0) {
                    queue.add(pointer);
                }
            }
        }
        
        // 處理的課程數(shù)目等于所有課程說明所有課程之間可以構(gòu)成拓撲排序
        return count == numCourses;
    }
}
最后編輯于
?著作權(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)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評論 19 139
  • 樹形動態(tài)規(guī)劃,顧名思義就是樹+DP,先分別回顧一下基本內(nèi)容吧:動態(tài)規(guī)劃:問題可以分解成若干相互聯(lián)系的階段,在每一個...
    Mr_chong閱讀 1,603評論 0 2
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,922評論 0 33
  • 曾在田野山地里翻滾,也曾留戀于港臺故事集連續(xù)劇,或許躲在被窩里偷偷看青澀的江湖,抑或是匍匐于勤學(xué)苦讀的書山無涯之前...
    七里汀閱讀 293評論 0 1
  • 聽說,他去了遠方 聽說,她將成為別人的新娘 聽說,他已衣錦還鄉(xiāng) 聽說,她現(xiàn)在幸福美滿 聽說,他們已白發(fā)蒼蒼 聽說,...
    鄉(xiāng)凝閱讀 289評論 0 0

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