[leetcode/lintcode 題解] Amazon面試題:課程表

現(xiàn)在你總共有 n 門課需要選壕探,記為 0n - 1.

一些課程在修之前需要先修另外的一些課程博肋,比如要學(xué)習(xí)課程 0 你需要先學(xué)習(xí)課程 1 仓犬,表示為[0,1]

  • 給定n門課以及他們的先決條件渗饮,判斷是否可能完成所有課程蚕冬?

在線評測地址:lintcode領(lǐng)扣

例1:

輸入: n = 2, prerequisites = [[1,0]] 
輸出: true

例2:

輸入: n = 2, prerequisites = [[1,0],[0,1]] 
輸出: false

【題解】

對于兩門課之間的約束關(guān)系傲霸,很容易聯(lián)想到圖疆瑰,我們可以將課抽象為節(jié)點(diǎn),將約束抽象為一條有向邊昙啄,可以用有向圖的相關(guān)算法解決問題穆役。拓?fù)渑判蛘每梢越鉀Q這一問題。

算法:拓?fù)渑判?/strong>

一個合法的選課序列就是一個拓?fù)湫蚴崃荩負(fù)湫蚴侵敢粋€滿足有向圖上耿币,不存在一條邊出節(jié)點(diǎn)在入節(jié)點(diǎn)后的線性序列,如果有向圖中有環(huán)韧拒,就不存在拓?fù)湫蜓徒印?梢酝ㄟ^拓?fù)渑判蛩惴▉淼玫酵負(fù)湫蚺岩纾约芭袛嗍欠翊嬖诃h(huán)塑悼。

拓?fù)渑判虿襟E:

  1. 建圖并記錄所有節(jié)點(diǎn)的入度。
  2. 將所有入度為0的節(jié)點(diǎn)加入隊列楷掉。
  3. 取出隊首的元素now厢蒜,將其加入拓?fù)湫蛄小?/li>
  4. 訪問所有now的鄰接點(diǎn)nxt,將nxt的入度減1烹植,當(dāng)減到0后斑鸦,將nxt加入隊列。
  5. 重復(fù)步驟3草雕、4巷屿,直到隊列為空。
  6. 如果拓?fù)湫蛄袀€數(shù)等于節(jié)點(diǎn)數(shù)墩虹,代表該有向圖無環(huán)嘱巾,且存在拓?fù)湫颉?/li>

復(fù)雜度分析

設(shè)課程數(shù)憨琳,即圖的節(jié)點(diǎn)數(shù)為V。

約束數(shù)量浓冒,即圖的邊數(shù)為E栽渴。

時間復(fù)雜度O(V + E)

  • 建圖,掃描一遍所有的邊O(E)稳懒。
  • 每個節(jié)點(diǎn)最多入隊出隊1次闲擦,復(fù)雜度O(V)
  • 鄰接表最終會被遍歷1遍场梆,復(fù)雜度O(E)墅冷。
  • 綜上,總復(fù)雜度為O(E + V)或油。

空間復(fù)雜度O(V + E)

  • 鄰接表占用O(E + V)的空間寞忿。
  • 隊列最劣情況寫占用O(V)的空間。
  • 綜上顶岸,總復(fù)雜度為O(V + E)腔彰。
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) {
        List[] graph = new ArrayList[numCourses];
        int[] inDegree = new int[numCourses];

        for (int i = 0; i < numCourses; i++) {
            graph[i] = new ArrayList<Integer>();
        }

        // 建圖
        for (int[] edge: prerequisites) {
            graph[edge[1]].add(edge[0]);
            inDegree[edge[0]]++;
        }

        int numChoose = 0;
        Queue queue = new LinkedList();

        // 將入度為 0 的編號加入隊列
        for(int i = 0; i < inDegree.length; i++){
            if (inDegree[i] == 0) {
                queue.add(i);
            }
        }

        while (! queue.isEmpty()) {
            int nowPos = (int)queue.poll();
            numChoose++;
            // 將每條邊刪去,如果入度降為 0辖佣,再加入隊列
            for (int i = 0; i < graph[nowPos].size(); i++) {
                int nextPos = (int)graph[nowPos].get(i);
                inDegree[nextPos]--;
                if (inDegree[nextPos] == 0) {
                    queue.add(nextPos);
                }
            }
        }

        return numChoose == numCourses;
    }
}

更多題解參見:leetcode/lintcode題解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霹抛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卷谈,更是在濱河造成了極大的恐慌杯拐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世蔗,死亡現(xiàn)場離奇詭異端逼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)污淋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門顶滩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寸爆,你說我怎么就攤上這事诲祸。” “怎么了而昨?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長找田。 經(jīng)常有香客問我歌憨,道長,這世上最難降的妖魔是什么墩衙? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任务嫡,我火速辦了婚禮甲抖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘心铃。我一直安慰自己准谚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布去扣。 她就那樣靜靜地躺著柱衔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪愉棱。 梳的紋絲不亂的頭發(fā)上唆铐,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機(jī)與錄音奔滑,去河邊找鬼艾岂。 笑死,一個胖子當(dāng)著我的面吹牛朋其,可吹牛的內(nèi)容都是我干的王浴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼梅猿,長吁一口氣:“原來是場噩夢啊……” “哼氓辣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粒没,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤筛婉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后癞松,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爽撒,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年响蓉,在試婚紗的時候發(fā)現(xiàn)自己被綠了硕勿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡枫甲,死狀恐怖源武,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情想幻,我是刑警寧澤粱栖,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站脏毯,受9級特大地震影響闹究,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜食店,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一渣淤、第九天 我趴在偏房一處隱蔽的房頂上張望赏寇。 院中可真熱鬧,春花似錦价认、人聲如沸嗅定。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渠退。三九已至,卻和暖如春捶箱,著一層夾襖步出監(jiān)牢的瞬間智什,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工丁屎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荠锭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓晨川,卻偏偏與公主長得像证九,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子共虑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354