Leetcode - Course Schedule II

My code:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class Solution {
    private int V = 0;
    private List<List<Integer>> adj;
    
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        V = numCourses;
        adj = new ArrayList<List<Integer>>();
        for (int i = 0; i < V; i++) {
            adj.add(new ArrayList<Integer>());
        }
        for (int i = 0; i < prerequisites.length; i++) {
            adj.get(prerequisites[i][1]).add(prerequisites[i][0]);
        }
        
        int[] indegree = new int[V];
        for (int i = 0; i < V; i++) {
            for (Integer temp : adj.get(i)) {
                indegree[temp]++;
            }
        }
        
        Queue<Integer> q = new LinkedList<Integer>();
        for (int i = 0; i < V; i++) {
            if (indegree[i] == 0) {
                q.offer(i);
            }
        }
        
        if (q.size() == 0) {
            return new int[0];
        }
        
        int counter = 0;
        int[] ret = new int[V];
        
        while (!q.isEmpty()) {
            Integer node = q.poll();
            for (Integer temp : adj.get(node)) {
                indegree[temp]--;
                if (indegree[temp] == 0) {
                    q.offer(temp);
                }
            }
            ret[counter++] = node;
        }
        if (counter != V) {
            return new int[0];
        }
        return ret;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[][] nums = new int[][]{{1,0}};
        int[] ret = test.findOrder(2, nums);
        System.out.println(ret);
    }
}

其實就是 topological sort 實現(xiàn)一下。這是BFS版本

下面是DFS版本:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class Solution {
    private int V = 0;
    private List<List<Integer>> adj;
    
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        V = numCourses;
        adj = new ArrayList<List<Integer>>();
        for (int i = 0; i < V; i++) {
            adj.add(new ArrayList<Integer>());
        }
        for (int i = 0; i < prerequisites.length; i++) {
            adj.get(prerequisites[i][1]).add(prerequisites[i][0]);
        }
        
        boolean[] isVisited = new boolean[V];
        HashSet<Integer> set = new HashSet<Integer>();
        Stack<Integer> st = new Stack<Integer>();
        for (int i = 0; i < V; i++) {
            if (!isVisited[i]) {
                boolean flag = visit(i, isVisited, set, st);
                if (!flag) {
                    return new int[0];
                }
            }
        }
        
        int[] ret = new int[V];
        for (int i = 0; i < V; i++) {
            ret[i] = st.pop();
        }
        
        return ret;
    }
    
    private boolean visit(int node, boolean[] isVisited, HashSet<Integer> set, Stack<Integer> st) {
        if (set.contains(node)) {
            return false;
        }
        set.add(node);
        
        for (Integer temp : adj.get(node)) {
            boolean flag = visit(temp, isVisited, set, st);
            if (!flag) {
                return false;
            }
        }
        set.remove(node);
        if (!isVisited[node]) {
            st.push(node);
        }
        isVisited[node] = true;
        return true;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[][] nums = new int[][]{{1,0}};
        int[] ret = test.findOrder(2, nums);
        System.out.println(ret);
    }
}

差不多的思路挠日。就是 isVisited[] 需要在最后設(shè)置成 true
在設(shè)true之前,還需要先判斷下其是否為false柑营,如果是刀诬,再把這個結(jié)點插入到棧中声旺,防止重復(fù)插入元素酷师。

當然贮缕,不應(yīng)該在 visit的地方,加入 if (!isVisited[i]) 的條件问欠,
因為肝匆, 1 - 2互聯(lián),那么2也需要訪問1時發(fā)現(xiàn)已經(jīng)被訪問過了
這個訪問過了顺献,
可能是 在這次dfs過程中訪問過的旗国,
也可能是之前訪問過的,
無法區(qū)別注整,導(dǎo)致無法判斷是否存在 circle
記住了能曾,topological sort 只是針對于 有向度硝, 無環(huán)圖,有用

今天做題注意力不集中寿冕,不知道怎么了蕊程,心不在焉。
哎驼唱,不多說了藻茂,埋在心里吧。

Anyway, Good luck, Richardo! -- 09/09/2016

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玫恳,一起剝皮案震驚了整個濱河市辨赐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌京办,老刑警劉巖掀序,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異臂港,居然都是意外死亡森枪,警方通過查閱死者的電腦和手機视搏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門审孽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浑娜,你說我怎么就攤上這事佑力。” “怎么了筋遭?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵打颤,是天一觀的道長。 經(jīng)常有香客問我漓滔,道長编饺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任响驴,我火速辦了婚禮透且,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豁鲤。我一直安慰自己秽誊,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布琳骡。 她就那樣靜靜地躺著锅论,像睡著了一般。 火紅的嫁衣襯著肌膚如雪楣号。 梳的紋絲不亂的頭發(fā)上最易,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天怒坯,我揣著相機與錄音,去河邊找鬼藻懒。 笑死敬肚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的束析。 我是一名探鬼主播艳馒,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼员寇!你這毒婦竟也來了弄慰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蝶锋,失蹤者是張志新(化名)和其女友劉穎陆爽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扳缕,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡慌闭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躯舔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驴剔。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粥庄,靈堂內(nèi)的尸體忽然破棺而出丧失,到底是詐尸還是另有隱情,我是刑警寧澤惜互,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布布讹,位于F島的核電站,受9級特大地震影響训堆,放射性物質(zhì)發(fā)生泄漏描验。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一坑鱼、第九天 我趴在偏房一處隱蔽的房頂上張望膘流。 院中可真熱鬧,春花似錦姑躲、人聲如沸睡扬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卖怜。三九已至,卻和暖如春阐枣,著一層夾襖步出監(jiān)牢的瞬間马靠,已是汗流浹背奄抽。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甩鳄,地道東北人逞度。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像妙啃,于是被迫代替她去往敵國和親档泽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容