Leetcode - Course Schedule II

[分析]
在题I代码基础上增加记录拓扑遍历顺序即可。

public class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        if (prerequisites == null)
            return new int[0];
        int[] order = new int[numCourses];
        List<Set<Integer>> graph = new ArrayList<Set<Integer>>();
        int[] indegree = new int[numCourses];
        for (int i = 0; i < numCourses; i++)
            graph.add(new HashSet<Integer>());
        // build graph
        for (int i = 0; i < prerequisites.length; i++) {
            if (graph.get(prerequisites[i][1]).add(prerequisites[i][0])) 
                indegree[prerequisites[i][0]]++;
        }
        LinkedList<Integer> queue = new LinkedList<Integer>();
        for (int i = 0; i < numCourses; i++) {
            if (indegree[i] == 0)
                queue.offer(i);
        }
        int k = 0;
        while (!queue.isEmpty()) {
            int v = queue.poll();
            order[k++] = v;
            for (Integer w : graph.get(v)) {
                if (--indegree[w] == 0)
                    queue.offer(w);
            }
        }
        return k == numCourses ? order : new int[0];
    }
}

猜你喜欢

转载自likesky3.iteye.com/blog/2240473