剑指 Offer II 113. 课程顺序

拓扑排序
https://leetcode-cn.com/problems/QA2IGt/
题目:
在这里插入图片描述

先利用HashMap存储课程和后续课程构成邻接表;
记录每门课的入度;
用队列实现广度优先搜索;
先挑选入度为0的节点,并保存至队列中;
每次从队列中取出入度为0的节点,并将其对应的LinkedList中的节点入度减1,发现入度为0的节点时添加到队列中,直到队列为空;
最后判断order长度是否等于numCourses,相等表明是有向无环图,返回该结果;否则,返回空。

class Solution {
    public int[] findOrder(int numCourses, int[][] prerequisites) {
        //建立邻接表
        HashMap<Integer, LinkedList<Integer>> graph = new HashMap<>();
        int[] inDegree = new int[numCourses];
        for (int i = 0; i < numCourses; i++) {
            graph.put(i, new LinkedList<Integer>());
        }
        //添加每个节点对应后续节点,并记录每个节点入度
        for (int[] prerequisite : prerequisites) {
            graph.get(prerequisite[1]).add(prerequisite[0]);
            inDegree[prerequisite[0]]++;
        }

        //查找入度为0的节点
        List<Integer> order = new LinkedList<>();
        Queue<Integer> queue = new LinkedList<>();
        for (int i = 0; i < numCourses; i++) {
            if(inDegree[i] == 0){
                queue.offer(i);
            }
        }
        while(!queue.isEmpty()){
            int course = queue.poll();
            order.add(course);
            for (Integer c : graph.get(course)) {
                inDegree[c]--;
                if(inDegree[c] == 0){
                    queue.offer(c);
                }
            }
        }
        if(order.size() != numCourses){
            return new int[0];
        }
        int[] res = new int[numCourses];
        for (int i = 0; i < order.size(); i++) {
            res[i] = order.get(i);
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值