hot100-48课程表

帖子仅个人学习用途,主要参考的资料是小红书小熊饼干老师和尼布斯老师。

春招加油!

一、题目

判断 有向图 中是否存在环

二、思路

将课程及其先修关系建模为一个有向图,其中课程是节点,先修关系是有向边(如 [a, b] 表示 b → a),问题转化为判断该有向图是否存在环;若存在环,则无法完成所有课程,否则可以。

使用拓扑排序,通过构建邻接表表示图、入度数组记录每个节点的依赖数,将入度为 0 的课程加入队列,依次"学习"并减少其后继课程的入度,重复此过程,若最终能处理完所有课程(即访问节点数等于课程总数),说明图中无环,返回 true,否则返回 false。

三、代码

复制代码
class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        //创建邻接表 graph[i] 存储课程i的后继课程
        List<List<Integer>> graph = new ArrayList<>();
        for(int i =0; i<numCourses;i++){
            graph.add(new ArrayList<>());
        }
        //构建入度数组 inDegree[i] 表示课程 i 的前置课程数量
        int[] inDegree = new int[numCourses];
        for(int[] pre : prerequisites){
            int next = pre[0];//要上的课程
            int prev = pre[1];//前置课程
            graph.get(prev).add(next);//构建邻接表
            inDegree[next]++;
        }
        //初始化队列,将所有入度为0的课程入队
        Queue<Integer> queue = new LinkedList<>();
        for(int i=0;i<numCourses;i++){
            if(inDegree[i] == 0){
                queue.offer(i);
            }
        }
        int visited = 0;//上过的课程,已完成的课程
        // BFS 遍历队列
        while(!queue.isEmpty()){
            int course = queue.poll();//取出可选的课程
            visited++;//完成的课程计数
            for(int next : graph.get(course)){//遍历学完的这门课的后置课程
                inDegree[next]--;//减少依赖入度
                if(inDegree[next] == 0){//如果入度为0,则可学
                    queue.offer(next);
                }
            }
        }
        //如果访问的课程数量等于总课程数,则学完了说明无环
        return visited == numCourses;

    }
}

graph:邻接表,存储课程之间的依赖关系(边),学完A这个前置课程还能学谁

inDegree:入度数组,记录每门课还剩多少先修课程未完成,B还差几门课(还有几门前置课程)才能学

queue:队列,存放当前可学的课程(BFS遍历),当前可以学的课程

相关推荐
敲代码的嘎仔14 小时前
力扣高频SQL基础50题详解
开发语言·数据库·笔记·sql·算法·leetcode·后端开发
小虎牙00714 小时前
面试被问复杂度总懵?这篇指南帮你彻底搞清
算法
knight_9___15 小时前
大模型project面试4
人工智能·python·深度学习·算法·面试·agent
l1t15 小时前
DeepSeek总结的欢迎来到 ORDER BY 丛林
数据库·算法
谙弆悕博士15 小时前
【附C源码】二叉搜索树的C语言实现
c语言·开发语言·数据结构·算法·二叉树·项目实战·数据结构与算法
宵时待雨15 小时前
回溯算法专题2:二叉树中的深搜
开发语言·数据结构·c++·笔记·算法·深度优先
刀法如飞15 小时前
JavaScript 数组去重的 20 种实现方式,学会用不同思路解决问题
前端·javascript·算法
洛水水15 小时前
【力扣100题】46.单词拆分
算法·leetcode·职场和发展
MicroTech202516 小时前
量子安全赋能协同智能,微算法科技(NASDAQ :MLGO)研发PQS-BFL后量子区块链联邦学习框架
科技·算法·安全
平行侠16 小时前
A19 工业设备故障决策树智能诊断系统
算法·决策树·机器学习