图论

课程表

中等#207Java时间 O(V+E)空间 O(V+E)

题目要做什么

课程编号为 0 到 numCourses−1。[a,b] 表示学习 a 前必须完成 b,判断能否完成全部课程。

题目示例输入numCourses = 4, prerequisites = [[1,0],[2,0],[3,1],[3,2]]
题目示例输出true

01 为什么这样做

把先修关系画成 b→a。有向环会让环中课程永远无法满足条件。拓扑排序从入度为 0 的课程开始,完成后删除其出边,解锁新的零入度课程。

始终成立的条件

入度等于尚未完成的先修课数量;队列中的课程都可以立即学习。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public boolean canFinish(int numCourses, int[][] prerequisites) {3        List<List<Integer>> graph = new ArrayList<>();4        for (int i = 0; i < numCourses; i++) graph.add(new ArrayList<>());5        int[] indegree = new int[numCourses];6        for (int[] edge : prerequisites) {7            graph.get(edge[1]).add(edge[0]);8            indegree[edge[0]]++;9        }10        Deque<Integer> queue = new ArrayDeque<>();11        for (int i = 0; i < numCourses; i++) if (indegree[i] == 0) queue.add(i);12        int completed = 0;13        while (!queue.isEmpty()) {14            int course = queue.remove(); completed++;15            for (int next : graph.get(course)) {16                if (--indegree[next] == 0) queue.add(next);17            }18        }19        return completed == numCourses;20    }21}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索