11/11 <Topological Sort> 207

207. Course Schedule

我们定义二维数组 graph 来表示这个有向图,一维数组 in 来表示每个顶点的入度。我们开始先根据输入来建立这个有向图,并将入度数组也初始化好。然后我们定义一个 queue 变量,将所有入度为0的点放入队列中,然后开始遍历队列,从 graph 里遍历其连接的点,每到达一个新节点,将其入度减一,如果此时该点入度为0,则放入队列末尾。直到遍历完队列中所有的值,若此时还有节点的入度不为0,则说明环存在,返回 false,反之则返回 true

inDegree[]: 修该门课程的入度,即先修课数量;

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int[] inDegree = new int[numCourses];
        Map<Integer, List<Integer>> graph = new HashMap<>();
        //Graph: key->课程 value->所需先修课列表
        //inDegree[] 下标对应课程,value为对应的入度
        for(int i = 0; i < prerequisites.length; i++){
            inDegree[prerequisites[i][0]]++;
            if(graph.containsKey(prerequisites[i][1])){
                graph.get(prerequisites[i][1]).add(prerequisites[i][0]);
            }else{
                ArrayList<Integer> list = new ArrayList<>();
                list.add(prerequisites[i][0]);
                graph.put(prerequisites[i][1], list);
            }
        }
        
        Queue<Integer> queue = new LinkedList<>();
        for(int i = 0; i < numCourses; i++){
            if(inDegree[i] == 0) queue.add(i);
        }
        
        while(!queue.isEmpty()){
            int cur = queue.poll();
            List<Integer> toTake = graph.get(cur);
            for(int i = 0; toTake != null && i < toTake.size(); i++){
                inDegree[toTake.get(i)]--;
                if(inDegree[toTake.get(i)] == 0) queue.add(toTake.get(i));
            }
        }
        
        for(int i = 0; i <numCourses; i++){
            if(inDegree[i] != 0) return false;
        }
        return true;
    }
}

210. Course Schedule II

用Order[]来存储路线

class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        if(numCourses == 0) return null;
        
        int inDegree[] = new int[numCourses], order[] = new int[numCourses], index = 0;
        for(int i = 0; i < prerequisites.length; i++){
            inDegree[prerequisites[i][0]]++;
        }
        
        Queue<Integer> queue = new LinkedList<Integer>();
        for(int i = 0; i < numCourses; i++){
            if(inDegree[i] == 0){
                order[index++] = i;
                queue.offer(i);
            }
        }
        
        while(!queue.isEmpty()){
            int cur = queue.poll();
            for(int i = 0; i < prerequisites.length; i++){
                if(prerequisites[i][1] == cur){
                    inDegree[prerequisites[i][0]]--;
                    if(inDegree[prerequisites[i][0]] == 0){
                        //If inDegree is zero, then add the course to the order
                        order[index++] = prerequisites[i][0];
                        queue.offer(prerequisites[i][0]);
                    }
                }
            }
        }
        return (index == numCourses) ? order : new int[0];
    }
}
原文地址:https://www.cnblogs.com/Afei-1123/p/11835383.html