LeetCode No.24 课程表

2019-08-07  本文已影响0人  MRYDM

1.LeetCode207题目链接

https://leetcode-cn.com/problems/course-schedule/

2.题目解析

看完题目之后需要了解下拓扑排序以及图的表示法。该题主要是遍历查询有没有死环。
将入度为 0 的结点放入队列,找到入度为0的子节点并减1,如果能够将子节点入度为0,加入队列重复操作

 public boolean canFinish(int numCourses, int[][] prerequisites) {
        if (numCourses <= 0) {
            return false;
        }
        int plen = prerequisites.length;
        if (plen == 0) {
            return true;
        }
        int[] inDegree = new int[numCourses];
        for (int[] p : prerequisites) {
            inDegree[p[0]]++;
        }
        LinkedList<Integer> queue = new LinkedList<>();
        // 首先加入入度为 0 的结点
        for (int i = 0; i < numCourses; i++) {
            if (inDegree[i] == 0) {
                queue.addLast(i);
            }
        }
        // 拓扑排序的结果
        List<Integer> res = new ArrayList<>();
        while (!queue.isEmpty()) {
            Integer num = queue.removeFirst();
            res.add(num);
            // 把邻边全部遍历一下
            for (int[] p : prerequisites) {
                if (p[1] == num) {
                    inDegree[p[0]]--;
                    //是否入度为0
                    if (inDegree[p[0]] == 0) {
                        queue.addLast(p[0]);
                    }
                }
            }
        }
        return res.size() == numCourses;
    }
image
上一篇下一篇

猜你喜欢

热点阅读