207. 课程表

这题要使用BFS算法,BFS也就是广度优先搜索,DFS是深度优先搜索,BFS是一层一层走,DFS是一条路走到头

这张图展示的就是BFS算法

在这道题里,最重要的就是创建一个用来放每个节点入度个数的数组以及一个二维节点邻接表

数组用来记录当前节点的入度个数,入度个数为0的节点可以入队

那么像0,1,2这三个节点就能入队,入队后要出队,出队时我们需要在二维节点邻接表中找到这个节点对应的后续节点,并且对应的给该节点的入度数减1

并且我们需要维护一个记录数,最后没有节点能够入队且队列中没有数据时跳出循环

java 复制代码
class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        // 记录每门课程的度数
        int[] inDegree = new int[numCourses];
        // 初始化邻接表
        List<List<Integer>> adjList = new ArrayList<>();
        for (int i = 0;i<numCourses;i++){
            adjList.add(new ArrayList<>());
        }
        // 计算每门课程的入度,并构建邻接表
        for(int[] prerequisite :prerequisites){
            int course = prerequisite[0];
            int preCourse = prerequisite[1];
            //该门课程的入读数加一
            inDegree[course]++;
            //邻接表中加入邻接数据
            adjList.get(preCourse).add(course);
        }

        //度数为0的课程先入队,因为本来就不需要先前课程
        Queue<Integer> queue = new LinkedList<>();
        for(int i = 0;i<numCourses;i++){
            if(inDegree[i] == 0)    {
                queue.offer(i);
            }
        }


        // 记录已完成的课程数
        int count = 0;
        //只要队列中还有度数为0的课程
        while(!queue.isEmpty()){
            int selectedCourse = queue.poll();
            //统计个数加1
            count++;
            //完成更新.后续涉及此课程为前提课程的课程的度数减1
            //先获取当前课程的后续课程列表
            List<Integer> nextCourses = adjList.get(selectedCourse);
            for(int nextCourse : nextCourses){
                //后续课程的入度减1
                inDegree[nextCourse]--;
                //如果减到0了,入队
                if(inDegree[nextCourse] == 0){
                    queue.offer(nextCourse);
                }
            }

        }
        return count == numCourses;

    }
}
相关推荐
美丽的欣情9 小时前
RK3588 Debian 交叉编译环境搭建(Windows + VMware Debian + CMake)
运维·windows·debian
勤劳打代码10 小时前
Flutter 架构指南 —— windows 平台安装拆解
windows·架构
aramae13 小时前
C++11:现代C++的里程碑
c语言·开发语言·c++·windows·git·后端
执行x13 小时前
wsl2安装+桥接模式+固定IP
linux·windows·ubuntu
做萤石二次开发的哈哈15 小时前
如何接入萤石开放平台 ERTC Windows SDK?
windows·音视频·萤石开放平台
橙臣程15 小时前
在 Windows 中使用 WSL2 搭建 Ubuntu 开发环境
linux·windows·ubuntu
霸道流氓气质15 小时前
Windows 本地搭建 CDC 全链路测试环境(Kafka+Canel+binlog+SpringBoot)
windows·spring boot·kafka
郝开16 小时前
Windows 安装 Ostris AI Toolkit
人工智能·windows·toolkit·ai toolkit
疯狂成瘾者1 天前
Java 常见集合方法
java·windows·python
倒流时光三十年1 天前
MyBatis @MapKey 注解详解
windows·mybatis