Course Schedule II

public class Solution {
    /*
     * @param numCourses: a total of n courses
     * @param prerequisites: a list of prerequisite pairs
     * @return: the course order
     */
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        // write your code here
        int[] result = new int[numCourses];
        Map<Integer, Set<Integer>> map = new HashMap<>();
        int[] degree = new int[numCourses];
        for (int [] p : prerequisites) {
            if (!map.containsKey(p[1]) || !map.get(p[1]).contains(p[0])) {
                degree[p[0]]++;
            }
            map.putIfAbsent(p[1], new HashSet<>());
            map.get(p[1]).add(p[0]);
        }
        
        Queue<Integer> queue = new ArrayDeque<>();
        for (int i = 0; i < numCourses; i++) {
            if (degree[i] == 0) {
                queue.offer(i);
            }
            // System.out.println(degree[i]);
        }
    
        
        int i = 0;
        while (!queue.isEmpty()) {
            int current = queue.poll();
            result[i] = current;
            i++;
            if (!map.containsKey(current)) {
                continue;
            }
            
            for (int course : map.get(current)) {
                degree[course]--;
                if (degree[course] == 0) {
                    queue.offer(course);
                }
            }
        }
        // System.out.println(unSelected);
        return i == numCourses ? result : new int[0];
    }
}

最后更新于

这有帮助吗?