拓扑排序解决课程表问题

拓扑排序是专门应用于有向图的算法,可用BFS和DFS的写法来实现。这里只用BFS。
需要有个表记录每个节点的后驱节点以及数组来记录每个节点的入度数(前面有几个节点)。
还需要有个队列来保证得到的都是先上的课程。

class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        if(numCourses <= 0)
            return new int[0];

        //记录每个节点的后驱节点们
        HashSet<Integer>[] adj = new HashSet[numCourses];
        for(int i = 0; i < numCourses; i++){
            adj[i] = new HashSet<>();
        }
        //记录每个节点的入度数
        int[] inDegree = new int[numCourses];

        for(int[] p : prerequisites){
            adj[p[1]].add(p[0]);
            inDegree[p[0]]++;
        }

        //队列让入度为0的先出来,就是先上的课
        Queue<Integer> q = new LinkedList<>();
        for(int i = 0; i < numCourses; i++){
            if(inDegree[i] == 0){
                q.offer(i);
            }

        }

        int[] res = new int[numCourses];
        int count = 0;
        while(!q.isEmpty()){
            Integer head = q.poll();
            res[count++] = head;

            for(Integer success : adj[head]){
                inDegree[success] --;
                if(inDegree[success] == 0){
                    q.offer(success);
                }
            }

        }
        if(count == numCourses){
            return res;
        }
        return new int[0];
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
11-24 11:23
门头沟学院 C++
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务