【LeetCode热题100(52/100)】课程表

题目地址: 链接

思路: 核心思路:判断图是否有环。

递归:使用数组构建课程的邻接表,如果有环,遍历时一定会陷入死循环。期间利用 vited 判断当前访问节点的状态(是否重复访问,访问完毕,未访问)。

  1. 如果遇到 「未访问」 节点(vited[i] == 0),进入递归;
  2. 如果遇到 「正在访问」 节点(vited[i] == 1),有环!返回 false;
  3. 如果遇到「已访问完毕」节点(vited[i] == 2),可复用结果,返回 true;
js 复制代码
/**
 * @param {number} numCourses
 * @param {number[][]} prerequisites
 * @return {boolean}
 */

var canFinish = function(numCourses, prerequisites) {
    let adj = Array.from({length: numCourses}, () => new Array());
    for(const [course, precourse] of prerequisites)
        adj[course].push(precourse);
    
    const vited = new Array(numCourses).fill(0);
    const dfs = (i) => {
        // 利用缓存,复用
        if(vited[i] == 1) return false;
        if(vited[i] == 2) return true;

        vited[i] = 1; // 正在访问
        let curPreCourse = adj[i];

        let ans = true;
        for(let num of curPreCourse) {
            ans = dfs(num, vited);
            if(!ans) return ans;
        }
        vited[i] = 2; // 访问结束,可以复用
        return ans;
    }
    for(let i = 0; i < numCourses; i ++) {
        if(!dfs(i)) return false;
    } 

    return true;
};
相关推荐
Dingdangcat862 分钟前
YOLO12-ADown改进算法:两轮车辆行驶环境中的多目标检测与识别_1
算法·目标检测·目标跟踪
倔强的石头1062 分钟前
Linux 进程深度解析(三):调度算法、优先级调整与进程资源回收(wait与waitpid)
linux·服务器·算法
LYFlied2 分钟前
【一句话概括】Vue2 和 Vue3 的 diff 算法区别
前端·vue.js·算法·diff
s09071367 分钟前
多波束声呐 FPGA 信号处理链路介绍
算法·fpga开发·信号处理·声呐
User_芊芊君子12 分钟前
【LeetCode经典题解】:从前序和中序遍历构建二叉树详解
算法·leetcode·职场和发展
C雨后彩虹12 分钟前
虚拟理财游戏
java·数据结构·算法·华为·面试
jifengzhiling12 分钟前
卡尔曼增益:动态权重,最优估计
人工智能·算法·机器学习
ULTRA??2 小时前
插入排序算法实现(二分查找搜索版本)
c++·算法
Elias不吃糖2 小时前
LeetCode 71:简化 Unix 路径(Simplify Path)——栈 / vector
算法·leetcode·
sheeta19982 小时前
LeetCode 每日一题笔记 日期:2025.12.15 题目:2110.股票平滑下跌阶段的数目
笔记·算法·leetcode