拓扑排序——课程表207

课程表

题目:课程表

    你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1。
    在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。
    请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。

 

示例1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:true
解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。

示例2:

输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
输出:false
解释:总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。

 

题解

    判断是否存在拓扑排序,并且拓扑排序的个数等于numCourses 

class Solution {
        public boolean canFinish(int numCourses, int[][] prerequisites) {
            Queue<Integer> queue=new ArrayDeque<>();
            int book[]=new int[numCourses];
            Map<Integer, Set<Integer>> map=new HashMap<>();

            for(int i=0;i<prerequisites.length;i++)
            {
                int first=prerequisites[i][1];
                int last=prerequisites[i][0];

                map.putIfAbsent(first,new HashSet<>());
                map.get(first).add(last);
                book[last]++;
            }

            for(int i=0;i<numCourses;i++)
            {
                if(book[i]==0) queue.add(i);
            }

            int index=0;
            while (!queue.isEmpty())
            {
                int temp=queue.poll();
                index++;
                if(map.get(temp)!=null)
                {
                    for(Integer nigb: map.get(temp))
                    {
                        book[nigb]--;
                        if(book[nigb]==0) queue.add(nigb);
                    }
                }
            }

            return index==numCourses?true:false;
        }
    }

 

算法小白,请多指教

posted @ 2021-12-23 12:26  言思宁  阅读(39)  评论(0编辑  收藏  举报