Course Schedule

Course Schedule


There are a total of n courses you have to take, labeled from 0 to n - 1.

Some courses may have prerequisites, for example to take course 0 you have to first take course 1, which is expressed as a pair: [0,1]

Given the total number of courses and a list of prerequisite pairs, is it possible for you to finish all courses?

For example:

2, [[1,0]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0. So it is possible.

2, [[1,0],[0,1]]

There are a total of 2 courses to take. To take course 1 you should have finished course 0, and to take course 0 you should also have finished course 1. So it is impossible.

Note:
The input prerequisites is a graph represented by a list of edges, not adjacency matrices. Read more about how a graph is represented.

click to show more hints.

Hints:
  1. This problem is equivalent to finding if a cycle exists in a directed graph. If a cycle exists, no topological ordering exists and therefore it will be impossible to take all courses.
  2. Topological Sort via DFS - A great video tutorial (21 minutes) on Coursera explaining the basic concepts of Topological Sort.
  3. Topological sort could also be done via BFS.


Breath-First-Search


[[3,1],[4,1],[4,2],[5,2],[3,4],[4,5],[6,3],[6,4],[7,4],[7,5]] 


1.keep an array to store the number of prerequisites courses of every course and put the courses that do not have any prerequisites into a queue.


In this case, counter = {0,0,2,3,1,2,2}


2.Put course 1 and course 2 into the queue and update the array. counter = {0,0,1,1,0,2,2}. 

3.Put course 5 into the queue and update the array. counter  = {0,0,1,0,0,2,1}.
4.Put course 4 into the queue and update the array.counter = {0,0,0,0,0,1,0}.
5.put course 3,7 into the queue and update the array. counter = {0,0,0,0,0,0,0}.

All the elements in the counter become 0, so it is true.

public class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        if (prerequisites == null || prerequisites.length == 0)
            return true;
            
        int len = prerequisites.length;
        Queue<Integer> queue = new LinkedList<Integer>();
        
        int[] counter = new int[numCourses];
        
        for (int i = 0; i < len; i++) {
            counter[prerequisites[i][0]]++;
        }
        
        for (int i = 0; i < numCourses; i++) {
            if(counter[i] == 0)
                queue.add(i);
        }
        
        int numNoPre = queue.size();
        while (!queue.isEmpty()) {
            int top = queue.remove();
            for (int i = 0; i < len; i++) {
                if (prerequisites[i][1] == top) {
                    counter[prerequisites[i][0]]--;
                    if (counter[prerequisites[i][0]] == 0){
                        numNoPre++;
                        queue.add(prerequisites[i][0]);
                    }
                }
            }
        }
        
        return numNoPre == numCourses;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章