[leedcode 207] 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.

public class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        //本题是求拓扑图,验证图是否有环,从叶子节点开始求(出度为0的点),如果所有点都能遍历到,则满足条件
        //需要辅助数组,数组的下标代表课程编号,数组的值代表出度
        //queue保存的是出度为0的点,每次向里面添加需要计算个数count,最后结果需要判断count是否等于课程数numCourses
        int []flag=new int[numCourses];
        for(int i=0;i<prerequisites.length;i++){
           
            flag[prerequisites[i][1]]++;
        }
        LinkedList<Integer> queue=new LinkedList<Integer>();
        int count=0;
        for(int i=0;i<numCourses;i++){
            if(flag[i]==0){//出度为0
                queue.add(i);
                count++;
            }
        }
        while(!queue.isEmpty()){
            int k=queue.remove();
            for(int i=0;i<prerequisites.length;i++){
                if(k==prerequisites[i][0]){
                    int l=prerequisites[i][1];
                    flag[l]--;
                    if(flag[l]==0){
                        count++;
                        queue.add(l);
                    }
                }
                    
            }
            
            
        }
        return count==numCourses;
        
    }
}

 

posted @ 2015-08-04 21:54  ~每天进步一点点~  阅读(125)  评论(0编辑  收藏  举报