Course Schedule

Note:

1) For integer node 0~n, we don't need a hashmap, we can just use array to act like a map; 

2) How to initial List[] is very important

3) We need two things. One is the relationship between the node and its dependency (out degree map). The other one is dependend nodes' in-degree map.

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) {
        // Write your code here
        //Out Degree relationship
        List[] edges = new ArrayList[numCourses]; 
        //In Degree map
        int[] degrees = new int[numCourses];
        
        for (int i = 0; i < numCourses; i++) {
            edges[i] = new ArrayList<Integer>();
        }
        
        for (int i = 0; i < prerequisites.length; i++) {
            degrees[prerequisites[i][0]]++;
            edges[prerequisites[i][1]].add(prerequisites[i][0]);
        }
        
        Queue<Integer> q = new LinkedList<Integer>();
        for (int i = 0; i < numCourses; i++) {
            if (degrees[i] == 0) {
                q.offer(i);
            }
        }
        
        int count = 0;
        while (!q.isEmpty()) {
            int course = q.poll();
            count++;
            int n = edges[course].size();
            for (int i = 0; i < n; i++) {
                int advancedCourse = (int)edges[course].get(i);
                if (degrees[advancedCourse] == 1) {
                    q.offer(advancedCourse);
                }
                degrees[advancedCourse]--;
            }
        }
        return (count == numCourses);
    }
}

 

posted on 2017-06-14 08:38  codingEskimo  阅读(114)  评论(0编辑  收藏  举报

导航