207 课程表

题目

你这个学期必须选修 numCourses 门课程,记为 0numCourses - 1

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai必须 先学习课程 bi

  • 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false

示例 1:

lua 复制代码
输入: numCourses = 2, prerequisites = [[1,0]]
输出: true
解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。

代码与解析

java 复制代码
class Solution {
    /**
     * 判断课程是否能够完成
     *
     * @param numCourses    课程数量
     * @param prerequisites 课程先修关系的数组
     * @return 如果能完成所有课程返回true,否则返回false
     */
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        // 创建图的邻接表
        List<List<Integer>> list = new ArrayList<>();
        for (int i = 0; i < numCourses; i++) {
            list.add(new ArrayList<>());
        }

        // 初始化状态数组,0表示未访问,1表示正在访问,-1表示已访问
        int[] state = new int[numCourses];

        // 构建邻接表
        for (int[] cp : prerequisites) {
            list.get(cp[1]).add(cp[0]); // 记录先修课对应的后续课程
        }

        // 对每门课程进行深度优先搜索,判断是否有环
        for (int i = 0; i < numCourses; i++) {
            if (!dfs(list, state, i)) return false; // 若存在环,则返回false
        }
        return true; // 不存在环,返回true
    }

    /**
     * 深度优先搜索判断是否存在环
     *
     * @param list  课程的邻接表
     * @param state 课程状态数组
     * @param need  当前需要判断的课程
     * @return 存在环返回false,否则返回true
     */
    public boolean dfs(List<List<Integer>> list, int[] state, int need) {
        if (state[need] == 1) return false; // 若当前课程正在访问中,说明存在环,返回false
        if (state[need] == -1) return true; // 若当前课程已访问过,直接返回true

        state[need] = 1; // 标记当前课程正在访问中

        // 对当前课程的后续课程进行深度优先搜索
        for (Integer t : list.get(need)) {
            if (!dfs(list, state, t)) return false; // 若后续课程存在环,返回false
        }

        state[need] = -1; // 标记当前课程访问结束
        return true; // 当前课程不存在环,返回true
    }
}
相关推荐
大学生资源网2 分钟前
基于springboot的智能家居系统的设计与实现(源码+文档)
java·spring boot·后端·毕业设计·源码
计算机毕设VX:Fegn089520 分钟前
计算机毕业设计|基于springboot + vue校园招聘系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
自由生长202431 分钟前
windows上写C++的编译器选择和环境
后端
华仔啊33 分钟前
都在用 Java8 或 Java17,那 Java9 到 16 呢?他们真的没用吗?
java·后端
WizLC34 分钟前
【后端】面向对象编程是什么(附加几个通用小实例项目)
java·服务器·后端·python·设计语言
风象南36 分钟前
SpringBoot 该不该用统一包装类
后端
muyouking1138 分钟前
Rust Nightly 切换指南:解锁前沿特性的钥匙
开发语言·后端·rust
没有bug.的程序员44 分钟前
Ribbon vs LoadBalancer 深度解析
jvm·后端·spring cloud·微服务·ribbon·架构·gc调优
CryptoRzz1 小时前
墨西哥股票数据 API 对接实战指南(含实时行情与 IPO 功能)
java·后端·websocket·区块链
IT_陈寒1 小时前
SpringBoot 3.0实战:5个高频踩坑点及性能优化方案,让你的应用吞吐量提升40%
前端·人工智能·后端