LeetCode-207-课程表

题目

在这里插入图片描述

思路

  1. 无语了,这题目能一对多能不能早说…写了半天一对一结果发现测试用例里面可以一对多.
  2. 润去题解,这是图的拓扑排序

代码

    public boolean canFinish(int numCourses, int[][] prerequisites) {
        //建立一个数组 指它依赖多少门课
        int[] nums = new int[numCourses];
        //上了[i][0]的课 才能上[i][1]的课 i[1]->i[0]
        //用map记录依赖关系 key为课程号 value为 为了上这门课 要上哪些课
        HashMap<Integer, List<Integer>> map = new HashMap<>();
        for(int i=0;i<prerequisites.length;i++){
            int key = prerequisites[i][0];
            int value = prerequisites[i][1];
            if(key==value) return false;

            nums[key]++;
            //加入map
            List<Integer> list = new ArrayList<>();
            if(map.containsKey(key)){
                list = map.get(key);
            }
            list.add(value);
            map.put(key,list);
        }
        //建立一个队列
        Queue<Integer> que = new LinkedList<>();
        //首先 可以让所有不依赖任何课的课入列 就是说没条件
        for(int i=0;i<numCourses;i++){
            if(nums[i]==0) que.add(i);
        }
        //到现在选了多少门课
        int count=0;
        while(!que.isEmpty()){
            //先出队列一个 作为当前选课
            int now = que.poll();
            count++;
            //这门课的后续课有哪些
            List<Integer> list = map.get(now);
            //如果确实有后续课
            if(list!=null){
                //因为这门课被选了 所以那些课被依赖的次数要减一
                for(int i=0;i<list.size();i++){
                    nums[list.get(i)]--;
                    //r如果变成0了 可以再放入队列里 进行后续判断
                    if(nums[list.get(i)]==0) que.add(list.get(i));
                }
            }
        }
        return count == numCourses;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值